关于Java:为什么list String 不可接受为list object?

Why List<String> is not acceptable as List<Object>?

本问题已经有最佳答案,请猛点这里访问。

考虑下面的方法doSomething(List),它接受List作为参数。

1
2
3
private void doSomething(List<Object> list) {
    // do something
}

现在考虑下面的代码片段,它试图调用doSomething(),在这里我试图将List传递给doSomething()

1
2
3
4
5
List<Object> objectList;
List<String> stringList;

doSomething(stringList); // compilation error incompatible types
doSomething(objectList); // works fine

甚至低于代码引发编译错误

1
objectList = stringList;  // compilation error incompatible types

我的问题是,为什么不能将List传递给接受List的方法?


因为当String扩展Object时,List不扩展List

更新:一般来说,如果FooBar的子类型(子类或子接口),而G是某种通用类型声明,则G不是G的子类型。

这是因为集合确实发生了变化。在您的情况下,如果ListList的子类型,那么当使用其父类型引用列表时,可以向其中添加除String以外的类型,如下所示:

1
2
3
4
List<String> stringList = new ArrayList<String>;
List<Object> objectList = stringList;// this does compile only if List<String> where subtypes of List<Object>
objectList.add(new Object());
String s = stringList.get(0);// attempt to assign an Object to a String :O

Java编译器必须防止这些情况。

更多关于Java教程页面的详细说明。