Java:将指定类型分配给泛型类型

Java:将指定类型分配给泛型类型,java,generics,types,Java,Generics,Types,我正在努力理解下面的代码 class Test<E extends SubTest> { List<Vector<E>> links; Test() { links = MyStaticClass.aList; // Where aList is static ArrayList<Vector<SubTest>>; } } 类测试 { 列出链接; 测试() { link

我正在努力理解下面的代码

class Test<E extends SubTest>
{
    List<Vector<E>> links;

    Test()
    {
        links = MyStaticClass.aList;
        // Where aList is static ArrayList<Vector<SubTest>>;
    }
}
类测试
{
列出链接;
测试()
{
links=MyStaticClass.aList;
//其中,aList是静态数组列表;
}
}
为什么将以下
ArrayList
分配给链接列表会出现错误。考虑到我用子测验扩展了E,难道它不理解作业吗


当我有一个参数T;我可以访问t属性,但我不能执行上述任务。
List
链接是否希望获得
ArrayList

您误解了错误

实际问题是
E
子测试
不同


如果您创建一个
Test
(其中
SubSubTest
继承
SubTest
),您的代码将尝试将
子测试的集合(可以保存任何派生类)放入
List
(只能保存
SubSubTest
)类型的变量中。

根据我的经验,在类的定义中,类的实际名称不能在编译时代替泛型
E
。尽管E是从Subtest派生的,但E是泛型类型,Subtest是类。所以这个问题不是由
子测试引起的,而是因为类被用来代替泛型类型

尽管这与您的问题没有直接关系,但它可能是有意义的:

//In a generic class, the compiler won't even allow you to instantiate 
//E with new

//If you try to do this:

 E obj1;
 obj1 = new E();  

 //You will see the compiler error that E is a type parameter and a CLASS 
 //has to be used with new, not a type parameter
您试图将一个实际对象:
MyStaticClass.aList
放入一个仍然需要泛型类型
E
的位置

每当我用泛型类型声明一个类时,我都无法用实际的类名来代替声明为具有泛型类型的该类的成员。我总是必须使用一个参数、变量等,使用类定义的泛型名称E


根据我的经验,要将基于泛型E的类
Test
的成员变量赋值,必须使用与
Test
类中的泛型E直接关联的变量。即使来自另一个泛型类的另一个“E”也不起作用:因为另一个泛型“E”与在测试类中定义为泛型的泛型不同

    Test<SubTest> x = new Test<SubTest>();
    x.links = MyStaticClass.aList;
testx=新测试();
x、 links=MyStaticClass.aList;
您想用
子测试
实例化类型参数
E
。这是一个合理的期望。但问题是,当使用
new
关键字调用构造函数时,类型参数被实例化。您的错误是试图在构造函数体中实例化它。在构造函数的主体中,您应该按照它是什么来处理
E
:一个尚未实例化的参数


可能以后您想用
深奥的subtest
实例化
E
。在构造函数中进行赋值时,您会将类型为
ArrayList
的值赋值给类型为
List
的字段,这肯定是错误的。

类型为“E扩展子测试”而不是“子测试”。因此,您不能确保E==Subtest,它实际上可以是Subtest的任何子类型