繁体   English   中英

List <Object>和List <?>之间有什么区别

[英]What's the difference between List<Object> and List<?>

以前你把我烧死了,我必须说我多次搜索这个问题,我仍然无法理解List <Object>和List <?>之间的区别

我读过的所有书都说在Java中,每个类都隐含着Object的子类

但是我在这里看到了以下代码:

public static void printList(List<Object> list) {
    for (Object elem : list)
        System.out.println(elem + " ");
    System.out.println();
}

这段代码是错误的(故意用于教育目的),根据作者的原因是:

[...]只打印一个Object实例列表; 它不能打印List <Integer>,List <String>,List <Double>等,因为它们不是List <Object>的子类型

解决方案是:

public static void printList(List<?> list) {
    for (Object elem: list)
        System.out.print(elem + " ");
    System.out.println();
}

如您所见,唯一的区别是第一行:

public static void printList(List<Object> list) {
public static void printList(List<?> list) {

这就是我的问题的原因:List <Object>和List <?>之间有什么区别?

毕竟是对象超类的全部与否?

如果有人可以帮我一个简单的解释(我是Java的新手),我将不胜感激。

先感谢您。

说明:

是一个“通配符”。 您可以通过不同方式使用它:

无界通配符:

? 

带上限的通配符:

? extends Object (or another class)

带下限的通配符

? super Object (or another class)

例子:

List <?> list;

您可以分配给list的任何类型参数的任何名单。

List<? extends Number> list;

您可以使用类型参数Number(或Integer,Float,ecc)为列表分配任何列表

List<? super Integer> list;

您可以分配列出任何具有类型参数Integer的List,或者类型为Integer类型的类型(Number,Comparable,Serializable,Object ...)

摘要:

宣言

List<Object> list;

类似于

List<? super Object> list;

因为你可以只为“列表”分配一个对象列表; 那么你可以这样使用列表:

    list = new ArrayList<Object>();
    list.add(new String(""));
    list.add(new Integer(3));

StringObject的子类型并不意味着List<String>List<Object>的子类型。 如果是,则编译以下代码:

List<String> strings = new ArrayList<String>();
List<Object> objects = strings;
objects.add((Integer) 1);
strings.get(0).charAt(0); // but the Integer 1 does not have a charAt method ...

因此, List<String>不是List<Object>的子类型。

List<String>List<Object>都是List<?>子类型。 但是因为List<?>是更通用的类型,所以你不知道add方法采用什么类型:

List<String> strings = new ArrayList<String>();
List<?> objects = strings;
objects.add((Integer) 1); // does not compile

其中一个主要区别是如何修改列表。 以下效果很好

List<Object> l1;
l1.add(new Object()); // OK

而第二种情况产生编译错误。

List<?> l2;
l2.add(new Object()); // Compile error

我认为原因已在网站上多次辩论过了。 总之, <?> 意味着 (如在一个特定 未知类型。 由于该类型不是编译时知道的,因此不允许修改列表。

您基本上可以以类似的方式使用这两个版本。 但是,有一个很大的区别。 我们来声明如下:

List<Object> list1 = new ArrayList<Object>();
List<?> list2 = new ArrayList<String>();

现在,让我们试试下面的代码:

list1.add("");// this works fine
list2.add("");// this one issues a compile error

有人可能会问为什么这样。 这是因为在List<Object> ,代码告诉您那里有Object或子类型,但是在List<?>你可能有相同的东西,但你不知道到底是什么。 有人可以添加StringDouble ,然后尝试读取并转换为Integer 但同样,这是不可能的。

可能还有其他一些我现在不记得的差异。

Object是String的超类,但List <Object>不是List <String>的超类。 如果是,这将是一个问题:

List<String> strings = ...
addObject(strings);
...
void addObjects(List<Object> objects) {
    objects.add(new Object());
}

现在字符串包含一个不是String的元素。

这段代码是错误的(故意用于教育目的),根据作者的原因是:

[...]只打印一个Object实例列表; 它不能打印List,List,List等,因为它们不是List的子类型

这是因为参数化类型是不变的 ,例如对于类X和Y, List<X>既不是子类型也不是List<Y>的超类型。

区别在于无界通配符类型 ? 意味着类型是未知的,你不能假设它。 List<?>是类型安全的,你不能在其中放置除null之外的任何元素,并且你不能假设它包含的对象的类型。

List<Object>显然意味着List可以包含任何类型的对象。

 public static void main(String args[]){

   List<? super Object> list=new ArrayList<>();
   list.add("A");//works

   List<Object> list1=new ArrayList<>();
   list1.add("B");//works

   List<?> list2=new ArrayList<>();
   list2.add("11");//compile time error;

   List<? extends Object> list4=new ArrayList<>();
   list4.add("123");//compile Time error
}

清单<? extend Object>&List <? >不允许添加任何内容以了解原因: 在此处输入链接描述但另一方面列表<? super Object>允许向List添加值,因为提供的链接中的问题不存在。

列表,列表之间的区别<!--?--> , 列表<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.

相关问题 List和有什么不一样 <Object[]> 和清单 <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和List之间的Java差异<Object> 在LinkedList中,:list.add(…)和object.list.add(…)有什么区别? 无界通配符类型List有什么区别<?>和原始类型列表? List 和 List 有什么区别<Integer[]>并列出<List<Integer> &gt; 在 Java 中 对象的属性有什么区别?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM