Java 类型继承问题

Java 类型继承问题,java,inheritance,java-7,Java,Inheritance,Java 7,我真的不知道如何解释我的问题。下面是我拥有的几个对象的示例 假设我有课 public class Foo{} public class FooBar extends Foo{} 所有这些都很好,但是,如果我拿一个列表,说我想让它充满Foo对象,我就不能为它提供FooBar对象。为什么会这样 例如: List<Foo> fooList = Arrays.asList(new FooBar()); listwoolist=Arrays.asList(newfoobar()); 如果

我真的不知道如何解释我的问题。下面是我拥有的几个对象的示例

假设我有课

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

例如:

List<Foo> fooList = Arrays.asList(new FooBar());
listwoolist=Arrays.asList(newfoobar());
如果
FooBar扩展了Foo
,为什么不能将其转换回
Foo

数组。asList(new FooBar())
返回一个
列表,该列表不能分配给
列表
。如果可以将其分配给该列表,则可以创建一个
列表
,将其分配给
列表
,然后将
Foo
添加到必须包含
FooBar
的列表中,这显然是一个错误

相反,您需要:

List<Foo> fooList = new ArrayList<>();
fooList.add(new FooBar());
List-doulist=new-ArrayList();
添加(newfoobar());

如注释
数组中所述。asList(T..)
返回
List
。由于您将
FooBar
实例传递给来自Java 7的方法类型推断,因此使用
FooBar
类型作为
T
表示,这意味着此方法返回的
List
无法分配给
List
(您可以在以下位置阅读有关它的更多信息:)

在Java8中,改进了类型推断,使lambdas更加有用。现在,
T
不仅从参数推断类型,而且从应该保存结果的目标参考变量推断类型。这允许
T
List-dublist
而不是
new-FooBar()
参数推断
Foo

要在早期版本(如Java 7)中解决此问题,可以显式地为泛型方法
asList
like设置泛型类型

List<Foo> fooList = Arrays.<Foo>asList(new FooBar());
//                         ^^^^^ -- set generic types before method name
listwoolist=Arrays.asList(newfoobar());
//^——在方法名称之前设置泛型类型

更多信息请访问:(特别是“目标类型”部分)

将列表声明为列表,而不是缺少的构造函数括号。请提供一个。它为我编译,但如果我将
-source 1.7
添加到
javac
命令行,它在
不兼容类型上失败:列表无法转换为列表。所以我认为这是他们改变Java8规则的地方。不幸的是,Android(看起来你有一个“Android”标签,它被删除了)已经落后了——它们已经完全达到1.7了吗?顺便说一句,在将来,请给出一个具体的错误消息或行为,而不是说“它不工作”或“它不编译”或“我不能这样做”。编译器的错误消息有助于准确解释错误是什么,即使您不理解错误的意思,我们这些阅读问题的人通常也会这样做,它可以帮助我们回答您的问题。
Arrays.asList(new FooBar())
返回一个
列表
。如果
T
Foo
,则不是这样。这在Java8中编译得很好。当然,这对Android用户没有帮助。我不知道确切的规则变化,但我认为在Java 8中,该语言使用
=
左侧的类型来帮助它解释右侧的含义,而在Java 7中,它只查看右侧的表达式,不知道左侧的内容。我认为更改是使lambdas正常工作所必需的。@shmosel:
Arrays.asList
声明为
listaslist​(T…a)
,那么如果您传递它
T=FooBar
,为什么它会从
列表的赋值推断
T=Foo
。但别相信我的话,你自己试试。@shmosel:有意思<代码>列表foobarList=Arrays.asList(newfoobar());傻瓜=食物列表未按预期编译。但是,如果直接将
赋值给傻瓜
,Java8似乎可以推断出正确的
T
。每天学一件新东西!这就是我要找的!非常感谢。