为什么 List<String> 不能被接受为 List<Object>?

2022-09-01 07:14:11

考虑以下接受作为参数的方法。doSomething(List<Object>)List<Object>

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

现在考虑下面的代码片段,它试图调用我试图传递给的位置doSomething()List<String>doSomething()

List<Object> objectList;
List<String> stringList;

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

即使低于代码也会引发编译错误

objectList = stringList;  // compilation error incompatible types

我的问题是为什么不能传递给接受的方法?List<String>List<Object>


答案 1

因为虽然扩展 ,但不会扩展StringObjectList<String>List<Object>

更新:
一般情况下,如果 是 的子类型(子类或子接口),并且是某种泛型类型声明,则不是 的子类型。FooBarGG<Foo>G<Bar>

这是因为集合确实会发生变化。在您的例子中,如果 是 的子类型,则在使用其超类型引用列表时,可以向其添加除 以外的类型,如下所示:List<String>List<Object>String

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 教程页面的更多详细说明。


答案 2

如果这有效,您可以将错误类型的对象放入列表中:

private void doSomething(List<Object> list) {
    list.add(new Integer(123)); // Should be fine, it's an object
}

List<String> stringList = new ArrayList<String>();
doSomething(stringList); // If this worked....
String s = stringList.get(0); // ... you'd receive a ClassCastException here

推荐