和有什么区别
public List<?> myList;
和
public List<String> myList;
我知道后者将存储一个List
myList 对象(字符串),但不确定第一个做什么。我的猜测是它将接受任何对象type
。但这安全吗?
和有什么区别
public List<?> myList;
和
public List<String> myList;
我知道后者将存储一个List
myList 对象(字符串),但不确定第一个做什么。我的猜测是它将接受任何对象type
。但这安全吗?
正如您已经说过的,第二个将包含字符串列表。首先包含未知对象的列表,您需要在使用它们之前将它们显式转换为适当的对象。当您将通配符与继承List<? extends ABC>
等一起使用时,通配符还有其他好处。您需要阅读 java 文档的通配符部分。
这是一个简单的教程来了解它们http://tutorials.jenkov.com/java-generics/wildcards.html
是的,它不安全,这就是为什么在使用它作为参数时不能添加它的原因。您只能从中读取。
List<?>
表示输入到未知类型的列表。这可能是一个List<A>, a List<B>, a List<String>
等。
由于您不知道 List 的类型是什么类型,因此您只能从集合中读取,并且您只能将读取的对象视为 Object 实例。
public void processElements(List<?> elements){
for(Object o : elements){
System.out.println(o);
}
}
在此方法中,您无法在“元素”中添加内容。只看东西,因为你不知道元素是什么类型。
List<String>
是一个Parameterized Type
表示一个 List ,它只能包含 String 类型的对象,而
List<?>
是一个Unbounded Wildcard Type
表示一个列表,它只能包含某种未知类型的对象。
根据Effective Java,两者都可以安全使用,除了其中一个List
可能Raw Type
在运行时导致异常,并且仅提供与在引入泛型之前编写的遗留代码的兼容性和互操作性。