为什么List <String>是List的子类型,而不是List <Object>的子类型?

dan*_*007 4 java generics

可能重复:
为什么List <Number>不是List <Object>的子类型?

是不是Java中String的子类型Object

那么,为什么我不能将类型的对象传递List<String>给接受List<Object>作为参数的函数?但是,我可以将这样的对象传递给一个接受List作为参数的函数.

Ste*_*n C 11

String不是String中Object的子类型吗?

是的,但这不是List<String>一个子类型List<Object>.

考虑这个例子:

    List<String> l1 = new ArrayList<String>();
    List<Object> l2 = l1;  // This is a compilation error in real Java
    l2.add(new Integer(42));
    String oops = l1.get(0);
Run Code Online (Sandbox Code Playgroud)

如果(假设)List<String>是子类型List<Object>,那么你最终会在最后一个语句中Integer为一个String变量赋值.简而言之,我们会破坏静态类型的安全性.


但是,我可以将这样的对象传递给接受List作为参数的函数.

是的,这是事实.但是,您正在处理原始类型,并且在将对象从列表中拉出时必须使用显式类型转换.例如,上面的内容需要重写如下:

    List<String> l1 = new ArrayList<String>();
    List l2 = l1;
    l2.add(new Integer(42));
    String oops = (String) l1.get(0);
Run Code Online (Sandbox Code Playgroud)

请注意,类型转换意味着我们必须用运行时类型安全替换静态类型安全性.(当然,在这种情况下,类型转换会在运行时失败,因为实例的类型错误.)