List和List <object> </object>之间的Java差异

时间:2011-10-25 07:22:49

标签: java generics

java中的ListList<Object>有什么区别?

6 个答案:

答案 0 :(得分:3)

原始类型的一个特殊危险(例如List没有<?>)是原始类型即使在他们自己的声明之外也禁用检查

参考:a Java Puzzler显示原始类型的危险。 (从第13页开始)短版本:因为在语句中使用了原始类型,编译器没有评估其他地方的泛型类型,因此发生了奇怪的运行时异常。

简短的回答:这是一个使用原始类型的警告,这是有充分理由的。使用无界通配符List<?>强烈偏好原始类型List

答案 1 :(得分:3)

假设您有两个列表:

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开始,使用泛型为您的应用程序提供编译时类型安全性是个好主意。

答案 2 :(得分:2)

区别在于:

List<String> a = new ArrayList<String>();

List<Object> b = a; // compile error

List c = a; // fine

List<Object>与任何其他参数的List不兼容。但是,原始List与所有参数的List兼容。

答案 3 :(得分:1)

差异非常微妙。两者中较为明显的是List<Object>,它是任意对象的列表(因为每个类都有Object作为超类)。现在与List的区别在于List是无类型的,因此根本不会执行任何类型检查,这最终会导致某些警告,并可能导致奇怪的运行时行为。虽然Java知道List<Object>是一个可能包含任何内容的列表,但它不知道有关List的内容。因为如果你考虑“旧式”Java,你所知道的就是List<String>曾经只调用List。这就是这两者之间的差异...... List<Object>被定义为包含广泛的对象故意,而List则不是。

我希望能够澄清这个问题。如果没有,请告诉我们什么仍然不清楚。 :)

答案 4 :(得分:1)

Java中的泛型对于更好地进行错误检查(在编译时)非常重要,因为在运行时检查和调试期间花费的时间更少。

因此,没有直接的性能提升,但您很快就能发现错误。

结论:它有助于加快开发速度。

我强烈建议您仔细阅读:Generics in the Java Programming Language [pdf]

答案 5 :(得分:0)

对原始类型有一些特殊的处理方法;没有动机将它们全部列举,因为无论如何都不鼓励原始类型。

让我们谈谈一个更狭隘的问题,这可能是最相关的:给定一个对象,我们主要关心的是我们可以调用哪些方法;为此目的,如果其类型为ListList<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>)
...                                 ...

他们的大多数方法都是一样的!在这方面,这两种类型很难区分。