问题_1
class A {}
class B extends A {}
A aObj = new A();
B bObj = new B();
我们知道下面会在运行时导致类转换异常。
List<B> list_B = new ArrayList<B>();
list_B.add((B)aObj); //ClassCast exception
但是
List<? extends A> list_4__A_AND_SubClass_A = new ArrayList<B>();
List<A> list_A = (ArrayList<A>)list_4__A_AND_SubClass_A;
list_A.add(aObj); // No exception here, Why?
问题_2
使用如下方法
void method(List<? extends A> list_4__A_AND_SubClass_A){
//How do i find the passed list is of Type A or B ??
// To decide List<A> list_A = (ArrayList<A>)list_4__A_AND_SubClass_A;
// OR List<B> list_B = (ArrayList<B>)list_4__A_AND_SubClass_A;
}
更新
问题_1
最好我应该避免引用如下所示的集合进行修改;除非我们非常确定传递的列表是A/B类型;以保持该列表的完整性。
List<A> list_A = (ArrayList<A>)list_4__A_AND_SubClass_A;
问题_2
我认为我们可以从调用者方法向调用方法再传递一个参数,以在调用方法进行修改时保持列表的完整性。
void method(List<? extends A> list_4__A_AND_SubClass_A, Class<? extends A> obj){
if (A.class.isAssignableFrom(obj)) {
List<A> list_A = (List<A>)list_4__A_AND_SubClass_A;
list_A.add(new A());
list_A.add(new B());
} else if (B.class.isAssignableFrom(obj)){
List<B> list_B = (List<B>)list_4__A_AND_SubClass_A;
//list_B.add(new A()); //only we can add B
list_B.add(new B());
}
}
最佳答案
理想情况下, Actor 来自 List<B>
至List<A>
应该在运行时抛出异常;不幸的是,Java 无法在运行时决定这一点。幸运的是,在编译时您会收到有关该强制转换的警告。
关于java - 泛型通配符 : Assigning Super class object to a Subclass object list,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15255929/