为什么List <String>不能作为List <Object>使用?

这个问题在这里已经有了答案:

  • List <Dog>是List <Animal>的子类吗? 为什么Java泛型不是隐含多态的? 15个答案

  • Java中的这个通用问题可能让任何不熟悉泛型的人感到困惑,因为乍看起来它看起来像String是对象,所以List<String>可以用在需要List<Object>的地方,但这不是真的。 这会导致编译错误。

    因为List<Object> 可以存储任何东西,包括StringInteger等,但List<String>只能存储Strings

    也看看:为什么不从List <T>继承?


    因为当String扩展ObjectList<String>不会扩展List<Object>

    更新:
    一般来说,如果FooBar的子类型(子类或子接口),并且G是某种泛型类型声明,则G<Foo>不是G<Bar>的子类型。

    这是因为集合确实发生了变化。 在你的情况下,如果List<String>List<Object>的子类型,那么当使用超类型引用列表时,可以将String以外的类型添加到它,如下所示:

    List<String> stringList = new ArrayList<String>;
    List<Object> objectList = stringList;// this does compile only if List<String> where subtypes of List<Object>
    objectList.add(new Object());
    String s = stringList.get(0);// attempt to assign an Object to a String :O
    

    而Java编译器必须防止这些情况。

    有关此Java教程页面的更多细节。


    你可以把一个错误类型的对象放到列表中,如果这个工作正常的话:

    private void doSomething(List<Object> list) {
        list.add(new Integer(123)); // Should be fine, it's an object
    }
    
    List<String> stringList = new ArrayList<String>();
    doSomething(stringList); // If this worked....
    String s = stringList.get(0); // ... you'd receive a ClassCastException here
    
    链接地址: http://www.djcxy.com/p/53925.html

    上一篇: Why List<String> is not acceptable as List<Object>?

    下一篇: Is the Linq Count() faster or slower than List.Count or Array.Length?