Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 泛型通配符:将超类对象分配给子类对象列表_Java_Generics - Fatal编程技术网

Java 泛型通配符:将超类对象分配给子类对象列表

Java 泛型通配符:将超类对象分配给子类对象列表,java,generics,Java,Generics,问题1 我们知道下面的代码将在运行时导致类强制转换异常 List\u B=new ArrayList(); 列表添加((B)aObj)//类强制转换异常 但是 List理想情况下,从List到List的转换应该在运行时抛出异常;不幸的是,Java无法在运行时决定这一点。幸运的是,在编译时,您会收到该强制转换的警告 你在这里List这行: List<A> list_A = (ArrayList<A>)list_4__A_AND_SubClass_A; 完全可以,因为您没

问题1

我们知道下面的代码将在运行时导致类强制转换异常

List\u B=new ArrayList();
列表添加((B)aObj)//类强制转换异常
但是


List理想情况下,从
List
List
的转换应该在运行时抛出异常;不幸的是,Java无法在运行时决定这一点。幸运的是,在编译时,您会收到该强制转换的警告

  • 你在这里
    List这行:

    List<A> list_A = (ArrayList<A>)list_4__A_AND_SubClass_A;
    
    完全可以,因为您没有注意警告

    一般来说,对于泛型,
    List<?扩展>
    列表并不总是与
    列表相同

    回答问题2。

    不幸的是,所有泛型都是在编译时检查的,在运行时没有多少信息可用,所以在运行时,您只有一个对象列表,无法有效地测试这是什么类型的列表。在Java 1.5中引入后向兼容性和泛型时,这个“特性”是它们之间的一种折衷。

    对于“List List_a=(ArrayList)List_4_a_和_SubClass_a”行,我得到了类似“Type safety:Unchecked cast from List to ArrayList”这样的警告;“你能回答第2个问题吗?”+1谢谢!如果您对我的更新有任何意见,请告诉我。@Kanagavelu Sugumar。您在“Q_1”中破坏了数据完整性,与您的cast之前一样,列表只能包含
    B
    类型的元素,在cast之后,它可以同时包含
    A
    B
    类型的元素,当所有内容都包含在1个方法中时,一开始可能没什么大不了的,但是如果列表是您的方法的一个参数,你真的不能做这个演员。至于Q_2,它可能会起作用,但看起来确实不对。问问自己,你真的需要继承吗?阅读此->
    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?
    
    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;
    }
    
     List<A> list_A = (ArrayList<A>)list_4__A_AND_SubClass_A; 
    
    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());
         }
    }
    
    List<A> list_A = (ArrayList<A>)list_4__A_AND_SubClass_A;
    
    list_A.add(aObj);