java - 泛型通配符 : Assigning Super class object to a Subclass object list

标签 java generics

问题_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/

相关文章:

c# - ICollection<string> 到 string[]

swift - Swift 字典的通用项目 getter

java - 使用 java 生成 SSH key

java - 如何在关闭 jframe 之前询问我是否已保存文本文档

java - 当尝试用 Java 将一个数字的数字相加时,5+0 = 53?

c# - 对强类型事件处理程序使用泛型?

java - Tomcat 期望从页面返回响应是否有最大时间限制?

java - 有没有提供排序,没有重复元素,subList(index, index)方法的集合?

java - JDK 1.7 打破了向后兼容性? (泛型)

java - 同时提供两个列表内容的迭代器?