为什么List <String>不能作为List <Object>使用?
这个问题在这里已经有了答案:
Java中的这个通用问题可能让任何不熟悉泛型的人感到困惑,因为乍看起来它看起来像String是对象,所以List<String>
可以用在需要List<Object>
的地方,但这不是真的。 这会导致编译错误。
因为List<Object>
可以存储任何东西,包括String
, Integer
等,但List<String>
只能存储Strings
。
也看看:为什么不从List <T>继承?
因为当String
扩展Object
, List<String>
不会扩展List<Object>
更新:
一般来说,如果Foo
是Bar
的子类型(子类或子接口),并且G
是某种泛型类型声明,则G<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教程页面的更多细节。
你可以把一个错误类型的对象放到列表中,如果这个工作正常的话:
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
链接地址: http://www.djcxy.com/p/53925.html
上一篇: Why List<String> is not acceptable as List<Object>?
下一篇: Is the Linq Count() faster or slower than List.Count or Array.Length?