差异只是List和List <object>和List <! - ? - > </object>

时间:2014-03-08 19:08:08

标签: java generics erasure

根据擦除概念,我认为

ListList<Object>是非常的,但我注意到了

List<String> strList = new ArrayList<String>();  
        List<Object> objList = strList; //error
        List objList = strList; //valid construction
        List<?> objList = strList; //valid construction

3 个答案:

答案 0 :(得分:4)

  • List<?>是一个类型未知的列表。你不能插入那里 因为您无法知道允许插入的类型。它 有一个通用类型(或没有),但你无法知道它。如果 你可以插入一些东西(首先对列表进行类型转换) 违反某些事情,所以你不应该这样做。

  • List<Object>是一个列表,您可以在其中插入任何对象以及何时插入 你得到一个你只知道(起初)它是一个物体的物品(和 你已经知道了。)

  • List只允许向后兼容(我认为)。之前 Java 5没有泛型。 Java需要允许类型转换 ListList<Anything>因此遗留代码可以使用现代代码。

答案 1 :(得分:0)

List<?>genericwildcard),这意味着它从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,因为它不适合它。