我真的不知道如何解释我遇到的问题。下面是我拥有的一些对象的示例。
假设我有课
public class Foo{}
public class FooBar extends Foo{}
所有这一切都很好,但是如果我拿一个列表并说我希望它充满 Foo
对象,我不能为它提供 FooBar
对象。这是为什么?
例子:
List<Foo> fooList = Arrays.asList(new FooBar());
如果 FooBar extends Foo
,为什么它不能转换回 Foo
?
最佳答案
如评论中所述Arrays.asList(T...)
返回 List<T>
.因为你通过了FooBar
使用 Java 7 对该方法类型推断的实例 FooBar
输入 T
表示此方法返回 List<FooBar>
不能分配给 List<Foo>
(您可以在以下位置阅读更多相关信息:Is List<Dog> a subclass of List<Animal>? Why aren't Java's generics implicitly polymorphic?)
在 Java 8 中,类型推断得到改进,使 lambda 更有用。现在T
不仅从参数推断类型,而且从目标推断类型 - 应该保存结果的引用变量。这允许 T
推断Foo
来自 List<Foo> fooList
而不是 new FooBar()
争论。
要解决早期版本中的这个问题,例如您的 Java 7,您可以显式为泛型方法设置泛型类型 asList
喜欢
List<Foo> fooList = Arrays.<Foo>asList(new FooBar());
// ^^^^^ -- set generic types before method name
更多信息请访问:https://docs.oracle.com/javase/tutorial/java/generics/genTypeInference.html (特别是“目标类型”部分)
关于java - 类型继承问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47667273/