繁体   English   中英

List和List之间的Java差异<Object>

[英]Java difference between List and List<Object>

java中的ListList<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]

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

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

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

列表,列表之间的区别<!--?--> , 列表<t> , 列表<e> , 和列表<object><div id="text_translate"><p> <strong>List 、 List<?> 、 List<T> 、 List<E>和List<Object>之间有什么区别?</strong></p><h1> 1.清单</h1><p> List :是原始类型,因此不是typesafe的。 它只会在转换错误时产生运行时错误。 当转换错误时,我们希望出现编译时错误。 不推荐使用。</p><h1> 2.列表<?></h1><p> List<?>是一个无限通配符。 但我不确定它的用途是什么? 我可以毫无问题地打印一个List<?> :</p><pre> public static void test(List<?> list){ System.out.println(list); // Works }</pre><p> <strong>为什么我不能将项目添加到List<?> ?</strong></p><pre> public static void test(List<?> list){ list.add(new Long(2)); // Error list.add("2"); // Error System.out.println(list); }</pre><h1> 3.列表<T></h1><pre> public static void test(List<T> list){ // T cannot be resolved System.out.println(list); }</pre><p> 我不明白这种语法。 我看到了这样的东西,它有效:</p><pre> public <T> T[] toArray(T[] a){ return a; }</pre><p> <strong>有时,我会看到<T>或<E>或<U> 、 <T,E> 。</strong> <strong>它们都是一样的还是代表不同的东西?</strong></p><h1> 4. 列表<对象></h1><p> 这给出了错误“方法test(List<Object>)不适用于参数List<String> ”:</p><pre> public static void test(List<Object> list){ System.out.println(list); }</pre><p> 如果我尝试这个然后我得到“无法从List<String>投射到List<Object> ”:</p><pre> test((List<Object>) names);</pre><p> 我很迷惑。 <strong>String是Object的子类,那么为什么List<String>不是 List List<Object>的子类?</strong></p></div></object></e></t>

[英]Difference between List, List<?>, List<T>, List<E>, and List<Object>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 列表之间的区别<Object>并列出 List和有什么不一样 <Object[]> 和清单 <Object> ? 列表,列表之间的区别<!--?--> , 列表<t> , 列表<e> , 和列表<object><div id="text_translate"><p> <strong>List 、 List<?> 、 List<T> 、 List<E>和List<Object>之间有什么区别?</strong></p><h1> 1.清单</h1><p> List :是原始类型,因此不是typesafe的。 它只会在转换错误时产生运行时错误。 当转换错误时,我们希望出现编译时错误。 不推荐使用。</p><h1> 2.列表<?></h1><p> List<?>是一个无限通配符。 但我不确定它的用途是什么? 我可以毫无问题地打印一个List<?> :</p><pre> public static void test(List<?> list){ System.out.println(list); // Works }</pre><p> <strong>为什么我不能将项目添加到List<?> ?</strong></p><pre> public static void test(List<?> list){ list.add(new Long(2)); // Error list.add("2"); // Error System.out.println(list); }</pre><h1> 3.列表<T></h1><pre> public static void test(List<T> list){ // T cannot be resolved System.out.println(list); }</pre><p> 我不明白这种语法。 我看到了这样的东西,它有效:</p><pre> public <T> T[] toArray(T[] a){ return a; }</pre><p> <strong>有时,我会看到<T>或<E>或<U> 、 <T,E> 。</strong> <strong>它们都是一样的还是代表不同的东西?</strong></p><h1> 4. 列表<对象></h1><p> 这给出了错误“方法test(List<Object>)不适用于参数List<String> ”:</p><pre> public static void test(List<Object> list){ System.out.println(list); }</pre><p> 如果我尝试这个然后我得到“无法从List<String>投射到List<Object> ”:</p><pre> test((List<Object>) names);</pre><p> 我很迷惑。 <strong>String是Object的子类,那么为什么List<String>不是 List List<Object>的子类?</strong></p></div></object></e></t> List <Object>和List <?>之间有什么区别 List 和 List 有什么区别<Integer[]>并列出<List<Integer> &gt; 在 Java 中 如何找到两个java列表之间的区别? java中list中set和add方法的区别 Java中的集合和列表有什么区别? byte []和List之间有什么区别 <Byte> 在Java? Java泛型之间的通配符列表和通配符框列表之间的区别?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM