java - 类型继承问题

标签 java inheritance java-7

我真的不知道如何解释我遇到的问题。下面是我拥有的一些对象的示例。

假设我有课

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/

相关文章:

java - WebDriverWait 不工作

objective-c - Swift 3 - 父类(super class)方法正在执行而不是它的覆盖对应物

php - Doctrine2 多级继承

java - Play Framework - 无法为对象堆预留足够的空间

java - 使用 jdbi 进行更新时获取更新行的主键

java - 在 IBM WebSphere 上运行的意外异常 java.math.BigDecimal

java - 以优雅的方式检查两个参数是否为 null

java - GWT 2.6 - Java 6 冲突

java - 国际象棋 AI : MinMax on object implementation

c++ - 为什么我收到错误 C2061(语法错误 : identifier)?