我正在阅读有效Java中关于泛型的章节.
帮助我理解之间的区别Set,Set<?>以及Set<Object>?
以下段落摘自本书.
作为快速回顾,
Set<Object>是一个参数化类型,表示一个可以包含任何类型的对象的集合,Set<?>是一个表示一个集合的通配符类型,它只能包含某些未知类型的对象,并且Set是一个原始类型,它选择了泛型类型系统.
什么是"某种未知类型"?是所有未知类型的类型Object?在那种情况下,Set<?>和之间的具体区别是Set<Object>什么?
原始列表转换为List<?>正常.为什么原始列表列表不能转换为列表List<?>?
{ // works
List raw = null;
List<?> wild = raw;
}
{ // Type mismatch: cannot convert from List<List> to List<List<?>>
List<List> raw = null;
List<List<?>> wild = raw;
}
Run Code Online (Sandbox Code Playgroud)
背景故事(缓解xy问题):
我正在使用的API返回List<JAXBElement>.我碰巧知道它总是如此List<JAXBElement<String>>.我计划循环并构建自己的List<String>,但我在写时试图修复(但不是抑制)原始类型编译器警告List<JAXBElement> raw = api();.
我试过了:
List<JAXBElement<?>> raw = api();
List<JAXBElement<?>> raw = (List<JAXBElement<?>>) api();
Run Code Online (Sandbox Code Playgroud)
但这些给出了类型不匹配错误.
有趣的是,这没有任何警告或错误:
for (JAXBElement<?> e : api()) {
// ...
}
Run Code Online (Sandbox Code Playgroud) 它可能会被问到某个地方,但我找不到它.
请告诉我两者之间的确切区别:
ArrayList list = new ArrayList();
Run Code Online (Sandbox Code Playgroud)
和
ArrayList<?> list = new ArrayList();
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚这两者之间的确切区别.
谢谢...