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的任何子类型各位,请在回答之前阅读问题。OP没有问如何使这项工作正常进行——问题是为什么会出现错误。完全不同的问题!