【问题标题】:<? extends A> won't accept A's child classes<? extends A> 不会接受 A 的子类
【发布时间】:2015-09-16 09:34:03
【问题描述】:

我正在使用 Android Studio,但一直遇到不知道如何解决的问题。我不知道这是 Android Studio 的问题、Java 的问题还是犯了一个错误。

我有一个类,其构造函数如下:

public MakeQuery(Callable<ArrayList<? extends A>) {
     ...
}

我尝试使用以下几行创建该类的对象:

Callable<ArrayList<B>> callable = new Callable<ArrayList<B>>() {...};
MakeQuery makeQuery = new MakeQuery(callable);

(当然,B 类扩展了A。仔细检查)

但是当我调用构造函数时,IDE 告诉我它需要另一种类型的参数。

我犯了什么错误?感谢所有的帮助! :)

【问题讨论】:

  • 显示Callable类的所有代码
  • 是IDE告诉你还是java编译器?
  • IDE 告诉我。我不会编译。顺便说一下,Callable 是自 JDK v 1.5 以来就存在的接口。感谢您的帮助!
  • 你可以试试Callable&lt;ArrayList&lt;? extends A&gt;&gt; callable = new Callable&lt;ArrayList&lt;? extends A&gt;&gt;() {...};
  • 它可能有效,但这不是我想要的。

标签: java android arraylist extends


【解决方案1】:

Callable&lt;? extends ArrayList&lt;? extends A&gt;&gt;

原因很复杂,但你写的代码只有在你传入准确Callable&lt;ArrayList&lt;? extends A&gt;&gt;时才能工作。

规则是即使B 扩展AFoo&lt;B&gt; 也不会扩展Foo&lt;A&gt;。但是,它确实扩展了Foo&lt;? extends A&gt;

所以应用该规则两次:

  1. List&lt;B&gt; 没有扩展 List&lt;A&gt;,但它扩展了 List&lt;? extends A&gt;
  2. Callable&lt;List&lt;B&gt;&gt; 没有扩展 Callable&lt;List&lt;? extends A&gt;&gt;,但它扩展了 Callable&lt;? extends List&lt;? extends A&gt;&gt;

【讨论】:

  • 如果您解释原因,这个答案会更好。就算再复杂,也比“看似行得通”要好。
  • 我同意这一点。我很想知道为什么会这样。
  • 这里接受的答案很好地解释了它:stackoverflow.com/questions/4492950/…
  • 添加了解释。
  • 这个原因特别复杂。 en.wikipedia.org/wiki/…
猜你喜欢
  • 2022-11-16
  • 2014-06-08
  • 1970-01-01
  • 2012-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多