泛型中的原始类型与<?>之间的区别

Chi*_*tel 6 java generics collections

它可能会被问到某个地方,但我找不到它.

请告诉我两者之间的确切区别:

ArrayList list = new ArrayList();
Run Code Online (Sandbox Code Playgroud)

ArrayList<?> list = new ArrayList();
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚这两者之间的确切区别.

谢谢...

Ean*_*n V 5

ArrayList<?>简单地表示"任何类型".换句话说,任何类型的ArrayList都可以分配给这样的变量.那可能是ArrayList<Integers>,ArrayList<JButton>或其他任何东西.单独使用通配符,不使用关键字super(后跟类型),意味着您无法将任何内容添加到定义为的列表中ArrayList<?>.ArrayList但是,单独表示旧式无类型ArrayList,您可以进行各种操作,包括add.

List<?> list;
List<Integer> ints = new ArrayList<Integer>();
List<Integer> strings = new ArrayList<Integer>();
list = ints; // valid
list = strings; // valid
list.add("new"); // compile error
Run Code Online (Sandbox Code Playgroud)

更新:

假设我有以下方法:

void insert(List list) {
   // loop through list, do whatever you like
   list.add("my string"); // dangerous operation 
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我调用insert(ints)编译器将生成警告,但不会阻止我将String添加到整数列表.更改方法如下:

void insert(List<?> list) {
   // loop through list, do whatever you like
   list.add("my string"); // compiler error on this dangerous operation
}
Run Code Online (Sandbox Code Playgroud)

会阻止我做这样的操作.

  • 这可以用作只读列表。假设您需要将不同的列表传递给一个只对它们执行读取操作的函数。使用此语法,您可以这样做。但是,如果您将集合作为旧的无类型集合传递,则可能会对您的集合进行一些非法操作。如果您将泛型集合用作非泛型,那么编译器会警告您。使用 &lt;?&gt; 语法,编译器将保护您的列表(请参阅我的编辑)。 (2认同)