T-h*_*ame 3 java inheritance java-7
我真的不知道如何解释我的问题.下面是我拥有的一些对象的示例.
让我们说我上课了
public class Foo{}
public class FooBar extends Foo{}
Run Code Online (Sandbox Code Playgroud)
所有这一切都很好,但是如果我拿一个列表说我希望它充满了Foo对象,我就不能提供它FooBar.为什么是这样?
例:
List<Foo> fooList = Arrays.asList(new FooBar());
Run Code Online (Sandbox Code Playgroud)
如果FooBar extends Foo,为什么它不能被抛回Foo?
正如在评论中已经提到Arrays.asList(T...)的回报List<T>.由于您将FooBar实例传递给来自Java 7的方法类型推断使用了FooBar类型作为T表示,这意味着此方法返回List<FooBar>无法分配的内容List<Foo>(您可以在以下位置阅读更多信息:List <Dog>是List <Animal>的子类?为什么Java的泛型不是隐式多态的?)
在Java 8中,改进了类型推断以使lambdas更有用.现在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
Run Code Online (Sandbox Code Playgroud)
更多信息:https://docs.oracle.com/javase/tutorial/java/generics/genTypeInference.html(特别是"目标类型"部分)