List 和List 之间有什么区别

以前所有你烧我活着,我必须说我多次搜索这个问题,我仍然无法理解List 和List 之间的区别

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

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

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

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

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

解决方案是:

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

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

 public static void printList(List list) { public static void printList(List list) { 

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

毕竟是对象超类的一切与否?

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

先谢谢你。

说明:

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

无界通配符:

 ? 

带上限的通配符:

 ? extends Object (or another class) 

带下限的通配符

 ? super Object (or another class) 

例子:

 List  list; 

您可以指定列出任何类型参数列表。

 List list; 

您可以指定列出任何具有类型参数Number(或整数,浮点数,ecc)的List

 List list; 

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

概要:

宣言

 List list; 

类似于

 List list; 

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

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

StringObject的子类型并不意味着ListList的子类型。 如果是,则编译以下代码:

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

因此, List不是List的子类型。

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

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

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

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

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

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

我认为的原因已经在网站上多次辩论过了。 简而言之, 表示(如在一个特定未知的类型。 由于该类型不是编译时知道的,因此不允许修改列表。

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

 List list1 = new ArrayList(); List list2 = new ArrayList(); 

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

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

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

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

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

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

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

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

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

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

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

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

  public static void main(String args[]){ List list=new ArrayList<>(); list.add("A");//works List list1=new ArrayList<>(); list1.add("B");//works List list2=new ArrayList<>(); list2.add("11");//compile time error; List list4=new ArrayList<>(); list4.add("123");//compile Time error } 

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