根据擦除概念,我认为
List
和List<Object>
是非常的,但我注意到了
List<String> strList = new ArrayList<String>();
List<Object> objList = strList; //error
List objList = strList; //valid construction
List<?> objList = strList; //valid construction
答案 0 :(得分:4)
List<?>
是一个类型未知的列表。你不能插入那里
因为您无法知道允许插入的类型。它
有一个通用类型(或没有),但你无法知道它。如果
你可以插入一些东西(首先对列表进行类型转换)
违反某些事情,所以你不应该这样做。
List<Object>
是一个列表,您可以在其中插入任何对象以及何时插入
你得到一个你只知道(起初)它是一个物体的物品(和
你已经知道了。)
List
只允许向后兼容(我认为)。之前
Java 5没有泛型。 Java需要允许类型转换
List
和List<Anything>
因此遗留代码可以使用现代代码。
答案 1 :(得分:0)
List<?>
是generic
(wildcard
),这意味着它从String接受任何东西,这就是为什么
List<?> objList = strList; //valid construction
虽然List<String>
不是List<Object>
的子类型(但是String []实际上是Object []的子类型,这是泛型和数组混合不好的原因之一)。对于Object
List<? extends Object> objList = strList; //valid construction
因为String
扩展Object
,这意味着接受任何扩展到Object的内容。
答案 2 :(得分:-1)
第一个解释:
如果您定义的对象列表比您声明的那样,则此列表可以包含您想要的任何内容。 (这是您提供的一些其他信息。)
如果你定义一个字符串列表,那么这不是任何东西的列表。这是一个字符串列表。
字符串列表与对象列表不同。
技术说明:
让我们说你有这样一个班级:
class Machine<T> {
void process(T input) {
...
}
}
如果您随后创建了一个实例:new Machine<String>()
,而不是编译器知道,那么您的新对象就是处理字符串。如果你想让它处理一个数字,一个数组或其他任何东西,它将失败。
如果您创建一个更通用的机器,但调用new Machine<Object>()
,而不是编译器知道,那个机器可以处理字符串,数字,数组和任何类型的东西。
编译器不允许您将特定的String-Machine(new Machine<String>()
)强制转换为通用的Object-Machine(Machine<Object>
),因为这样可以让它让它处理Numbers,Arrays,因为它不适合它。