java类型继承问题
我真的不知道如何解释我的问题。下面是我拥有的几个物体的例子
假设我有课
public class Foo{}
public class FooBar extends Foo{}
所有这些都很好,但是,如果我拿一个列表,并说我想让它充满Foo
对象,我不能为它提供FooBar
对象。这是为什么
例如:
List<Foo> fooList = Arrays.asList(new FooBar());
如果FooBar extends Foo
,为什么不能把它放回Foo
# 1 楼答案
正如已经在评论中提到的
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?上了解更多信息)在Java8中,改进了类型推断,使lambdas更有用。现在
T
不仅从参数推断类型,而且从应该保存结果的目标引用变量推断类型。这允许T
从List<Foo> fooList
而不是new FooBar()
参数推断Foo
要在早期版本(如Java 7)中解决这个问题,您可以显式地为泛型方法
asList
设置泛型类型更多信息请访问:https://docs.oracle.com/javase/tutorial/java/generics/genTypeInference.html(尤其是“目标类型”部分)
# 2 楼答案
Arrays.asList(new FooBar())
返回一个List<FooBar>
,不能将其分配给List<Foo>
。如果可以分配给它,那么您可以创建一个List<FooBar>
,将其分配给一个List<Foo>
,然后将Foo
添加到必须包含FooBar
的列表中,这显然是一个错误相反,你需要: