Java 列表<&燃气轮机;或列表<;对象>;

Java 列表<&燃气轮机;或列表<;对象>;,java,generics,Java,Generics,我有一个方法,它的参数应该是“任何东西的列表”。该方法不会修改列表的内容。将此方法定义为 void foo(List<?> list) { } void foo(列表){ } 或 void foo(列表){ } 到底有什么区别呢?如果您不想修改列表,那么list更合适 这样你就可以通过e。g列表和列表到您的方法。您需要void foo(列表列表),否则您将无法传入一个列表 如果使用void foo(列表),则只能传入List 这是因为,在Java中,泛型不是:List不是Lis

我有一个方法,它的参数应该是“任何东西的列表”。该方法不会修改列表的内容。将此方法定义为

void foo(List<?> list) {
}
void foo(列表){
}

void foo(列表){
}

到底有什么区别呢?

如果您不想修改列表,那么
list
更合适

这样你就可以通过e。g<代码>列表和
列表
到您的方法。

您需要
void foo(列表列表)
,否则您将无法传入一个
列表

如果使用
void foo(列表)
,则只能传入
List


这是因为,在Java中,泛型不是:
List
不是
List

的子类型,这两种类型完全不同

void foo(List<?> list)
void foo(列表)
意思是你期望得到一个列表,但你没有指定它是什么

void foo(List<Object> list)
void foo(列表)
表示您希望传递的列表是对象列表,因此如果您尝试传递列表,它将不会被接受(与第一个声明相反)


一个常见的错误是假设
List
是一个子类型,也就是说
List
,即使String是一个suptype对象,情况也并非如此。

简短的回答是,使用
List
将允许您接受类似
List
的内容,而使用
List
则不会

这将在官方的泛型试验中讨论,并且

[…]下面是一个使用泛型(以及新的for循环语法)编写它的天真尝试:

void printCollection(集合c){
用于(对象e:c){
系统输出打印ln(e);
}
}
问题是这个新版本远不如旧版本有用。旧代码可以用任何类型的集合作为参数调用,而新代码只接受
collection
,正如我们刚才演示的,它不是所有类型集合的超类型
那么什么是所有类型集合的超类型?它是由
Collection
(发音为“Collection of unknown”)编写的,也就是说,它是一个元素类型与任何内容都匹配的集合。
出于明显的原因,它被称为通配符类型。我们可以写:

   void printCollection(Collection<?> c) {
       for (Object e : c) {
           System.out.println(e);
       }
   }
void printCollection(集合c){
用于(对象e:c){
系统输出打印ln(e);
}
}
现在,我们可以将其称为任何类型的集合

列表
具有参数化类型
对象
,这基本上意味着您可以在列表中添加所有对象

然而,
List
意味着这是一个未知的列表。只要您不打算在列表中添加任何内容,它基本上与
list
相同,但您将不得不担心以下情况:

List<?> unknownList = new ArrayList<String>();
unknownList.add(new Object()); //Compilation error.
List unknownList=new ArrayList();
添加(新对象())//编译错误。
(在本例中)意味着您只能添加
字符串
的值,或者是
字符串
的子类型

如果您只是要遍历列表并检索值,
list
list
本质上是相同的


更多信息。

本教程第3节和第4节应回答您的问题:

引用教程中的内容:

一般来说,如果Foo是Bar的子类型(子类或子接口),而G是某种泛型类型声明,那么G不是G的子类型

。。。集合,正如我们刚才演示的,它不是所有类型集合的超类型! 那么什么是所有类型集合的超类型呢?它是书面集合(发音为“Collection of unknown”),即元素类型与任何内容匹配的集合


但是,在严格的假设下,方法foo将不修改集合,在实现上应该没有区别。

如果使用未知项列表,则不能向列表中添加除null以外的任何内容,是的。
   void printCollection(Collection<?> c) {
       for (Object e : c) {
           System.out.println(e);
       }
   }
List<?> unknownList = new ArrayList<String>();
unknownList.add(new Object()); //Compilation error.