Java ArrayList泛型:子类

Java ArrayList泛型:子类,java,generics,arraylist,Java,Generics,Arraylist,为什么即使语句2无效,语句1仍然有效。我可以理解报表2无效的原因,但为什么相同的原则不适用于Statament 1 import java.util.*; public class CollectionTest { public static void main(String[] args) { ArrayList<ObjectB> test = new ArrayList<ObjectA>(); //statement 1

为什么即使语句2无效,语句1仍然有效。我可以理解报表2无效的原因,但为什么相同的原则不适用于Statament 1

import java.util.*;

public class CollectionTest
{
    public static void main(String[] args)
    {
        ArrayList<ObjectB> test = new ArrayList<ObjectA>(); //statement 1

        ObjectB B = new ObjectA("aaa");//statement 2
    }
}

class ObjectA
{
    String a;
    ObjectA(String str) { 
        a = str;
    }
}

class ObjectB extends ObjectA
{
    String b;
    ObjectB(String str) {
        super(str);
        b = str;
    }
}
import java.util.*;
公共类集合测试
{
公共静态void main(字符串[]args)
{
ArrayList test=新建ArrayList();//语句1
ObjectB=newObjectA(“aaa”);//语句2
}
}
类对象A
{
字符串a;
ObjectA(字符串str){
a=str;
}
}
类ObjectB扩展了ObjectA
{
b串;
ObjectB(字符串str){
超级(str);
b=str;
}
}

这是因为泛型在Java中没有具体化,它们在编译时被删除。语句1无效,但在更宽松的情况下会转换为
ArrayList
。语句2有一个强类型,其关系为“所有
ObjectB
s都是
ObjectA
s,但并非所有
ObjectA
s都是
ObjectB
s”。这类似于“并非所有动物都是狗,但所有狗都是动物。”

<。如果您尝试运行此命令,将出现编译器错误。不能将子类引用指定给超类对象。只能将超类引用分配给子类对象,如
ObjectA a=new ObjectB()
;此外,对于泛型,规则更为严格。您在左侧传递的类型应与右侧的类型匹配,如下所示

ArrayList<ObjectB> test1 = new ArrayList<ObjectB>(); // valid
?扩展ObjectA
任何东西都意味着您可以拥有任何对象,该对象可以扩展
ObjectA
(如果是类)或在RHS上实现
ObjectA
(如果是接口)。

您正在比较两个(无效)不同的对象。如果你想做这个类比,你应该这样定义你的数组列表:
arraylisttest=newarraylist()
ArrayList<ObjectA> test2 = new ArrayList<ObjectA>();  // valid
ArrayList<ObjectA> test = new ArrayList<ObjectB>(); // error
ArrayList<? extends ObjectA> test = new ArrayList<ObjectB>(); // valid
ArrayList<? extends ObjectA> test = new ArrayList<ObjectA>(); // valid