我对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
是一个抽象的超类,所以这个列表可以包含ChangeItem
或ChangeList
或者任何子类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。