Java - 将List <number>转换为List <integer>?

时间:2017-03-23 16:28:14

标签: java generics polymorphism subclass superclass

我对Java泛型如何处理继承/多态性感到有点困惑 完全可以将Number转换为整数,但它无法将List<Number>转换为List<Integer>。 为什么?

这是我的java代码示例:

    Number n = new Integer(5);
    Integer i = (Integer) n; // No compilation or runtime error ==> for me it's normal

    Number n = new Long(5);
    Integer i = (Integer) n; // No compilation error but have a runtime error (ClassCastException) ==> for me it's normal

    List<Number> nList = new ArrayList<Number>();
    nList.add(Integer.valueOf(5));
    List<Integer> iList = (List <Integer>) nList; // Compilation error ==> WHYYYY ?!!

感谢您的帮助。

编辑
这个问题与这个问题完全不同Is List<Dog> a subclass of List<Animal>? Why aren't Java's generics implicitly polymorphic?,因为我的问题不是为什么强制编写类强制转换。

更具体地说,我调用一个返回List<Change>的函数,其中Change是一个抽象的超类,所以这个列表可以包含ChangeItemChangeList或者任何子类Change取决于我的要求(参数)。

我知道我的请求使这个函数只返回ChangeItem所以我想轻易转换它以从函数返回它。我认为类转换是最简单的方法,但由于编译错误,它似乎不可能。

为什么可以编写和编译它:

    Number n = new Long(5);
    Integer i = (Integer) n;

虽然不可能编写并编译它:

    List<Number> nList = new ArrayList<Number>();
    nList.add(Integer.valueOf(5));
    List<Integer> iList = (List <Integer>) nList;

如果nList包含除Integer之外的其他内容,我只想要相同的ClassCastException。

0 个答案:

没有答案