[英]Java difference between List and List<Object>
java中的List
和List<Object>
什么区别?
原始类型的一个特殊危险(例如,没有<?>
List
)是原始类型甚至在它们自己的声明之外禁用检查
参考: 一个Java Puzzler ,显示原始类型的危险。 (从第13页开始)简短版本:因为在语句中使用了原始类型,编译器没有评估其他地方的泛型类型,因此发生了奇怪的运行时异常。
简短的回答:这是一个使用原始类型的警告,这是有充分理由的。 使用无限制的通配符List<?>
,优先于原始类型List
假设你有两个列表:
List<Object> mainList = new ArrayList<Object>();
和一个原始类型:
List rawList = new ArrayList();
现在让我们做这样的事情:
List<Integer> intList = new ArrayList<Integer>();
intList.add(42);
mainList.addAll(intList);
rawList.addAll(intList);
但是还有一个包含String对象的列表:
List<String> strList = new ArrayList<String>()
。
当我们试着打电话
strList.addAll(mainList)
我们得到编译错误:
The method addAll(Collection<? extends String>) in the type List<String> is not applicable for the arguments (List<Object>)
。
但如果我们试着打电话
strList.addAll(rawList)
我们只收到一个警告。
因此,如果您只在应用程序中使用对象列表,那么列表和列表之间实际上没有区别。 但是从Java 1.5开始,使用泛型为您的应用程序提供编译时类型安全性是个好主意。
区别在于:
List<String> a = new ArrayList<String>();
List<Object> b = a; // compile error
List c = a; // fine
List<Object>
与任何其他参数的List
不兼容。 然而,原始List
是兼容List
的所有参数的秒。
差异非常微妙。 两者中较为明显的是List<Object>
,它是一个任意对象的列表(因为每个类都有Object作为超类)。 到所不同的List
现在是List
是类型化的,因此根本没有类型检查被执行,最终导致某些警告,并可能导致奇怪的运行时行为。 虽然Java知道List<Object>
是一个可能包含任何内容的List
,但它并不知道有关List
。 因为如果你考虑“旧式”Java,你所知道的就是调用List<String>
以前只调用List
。 这就是这两个......之间的差异List<Object>
被定义为包含在用对象的范围广泛,而List
是没有的。
我希望能够澄清这个问题。 如果没有,请告诉我们什么仍然不清楚。 :)
Java中的泛型对于更好地进行错误检查(在编译时)非常重要,因为在运行时检查和调试期间花费的时间更少。
因此,没有直接的性能提升,但您很快就能发现错误。
底线:它有助于加快开发速度。
我强烈建议您仔细阅读 : Java编程语言中的泛型[pdf]
关于原始类型,有一些特殊的处理方法; 没有动机将它们全部列举,因为无论如何都不鼓励原始类型。
让我们谈谈一个更狭窄的问题,这可能是最相关的:给定一个对象,我们主要关心的是我们可以调用哪些方法; 为此目的,如果它的类型是List
或List<Object>
,有什么区别吗?
List<Object>
的方法是List<E>
方法,其中E替换为Object; 原始类型List
的方法是List<E>
的方法的擦除。 所以我们有
List List<Object>
boolean add(Object) boolean add(Object)
Object get(int) Object get(int)
int size() int size()
boolean addAll(Collection) boolean addAll(Collection<? extends Object>)
... ...
他们的大部分方法都是一样的! 在这方面,这两种类型很难区分。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.