有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java类型继承问题

我真的不知道如何解释我的问题。下面是我拥有的几个物体的例子

假设我有课

public class Foo{}
public class FooBar extends Foo{}

所有这些都很好,但是,如果我拿一个列表,并说我想让它充满Foo对象,我不能为它提供FooBar对象。这是为什么

例如:

List<Foo> fooList = Arrays.asList(new FooBar());

如果FooBar extends Foo,为什么不能把它放回Foo


共 (2) 个答案

  1. # 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不仅从参数推断类型,而且从应该保存结果的目标引用变量推断类型。这允许TList<Foo> fooList而不是new FooBar()参数推断Foo

    要在早期版本(如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(尤其是“目标类型”部分)

  2. # 2 楼答案

    Arrays.asList(new FooBar())返回一个List<FooBar>,不能将其分配给List<Foo>。如果可以分配给它,那么您可以创建一个List<FooBar>,将其分配给一个List<Foo>,然后将Foo添加到必须包含FooBar的列表中,这显然是一个错误

    相反,你需要:

    List<Foo> fooList = new ArrayList<>();
    fooList.add(new FooBar());