0

和有什么区别

public List<?> myList;

public List<String> myList;

我知道后者将存储一个ListmyList 对象(字符串),但不确定第一个做什么。我的猜测是它将接受任何对象type。但这安全吗?

4

3 回答 3

1

正如您已经说过的,第二个将包含字符串列表。首先包含未知对象的列表,您需要在使用它们之前将它们显式转换为适当的对象。当您将通配符与继承List<? extends ABC>等一起使用时,通配符还有其他好处。您需要阅读 java 文档的通配符部分。

这是一个简单的教程来了解它们http://tutorials.jenkov.com/java-generics/wildcards.html

于 2014-01-27T00:23:43.533 回答
1

是的,它不安全,这就是为什么在使用它作为参数时不能添加它的原因。您只能从中读取。

List<?>表示输入到未知类型的列表。这可能是一个List<A>, a List<B>, a List<String>等。

由于您不知道 List 的类型是什么类型,因此您只能从集合中读取,并且您只能将读取的对象视为 Object 实例。

public void processElements(List<?> elements){
   for(Object o : elements){
      System.out.println(o);
   }
}

在此方法中,您无法在“元素”中添加内容。只看东西,因为你不知道元素是什么类型。

于 2014-01-27T00:31:00.033 回答
1

List<String>是一个Parameterized Type表示一个 List ,它只能包含 String 类型的对象,而

List<?>是一个Unbounded Wildcard Type表示一个列表,它只能包含某种未知类型的对象。

根据Effective Java,两者都可以安全使用,除了其中一个List可能Raw Type在运行时导致异常,并且仅提供与在引入泛型之前编写的遗留代码的兼容性和互操作性。

于 2014-01-27T00:41:39.607 回答