java中的List
和List<Object>
有什么区别?
答案 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中的泛型对于更好地进行错误检查(在编译时)非常重要,因为在运行时检查和调试期间花费的时间更少。
因此,没有直接的性能提升,但您很快就能发现错误。
结论:它有助于加快开发速度。
答案 5 :(得分:0)
对原始类型有一些特殊的处理方法;没有动机将它们全部列举,因为无论如何都不鼓励原始类型。
让我们谈谈一个更狭隘的问题,这可能是最相关的:给定一个对象,我们主要关心的是我们可以调用哪些方法;为此目的,如果其类型为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>)
... ...
他们的大多数方法都是一样的!在这方面,这两种类型很难区分。