我试图理解以下代码。
class Test<E extends SubTest>
{
List<Vector<E>> links;
Test()
{
links = MyStaticClass.aList;
// Where aList is static ArrayList<Vector<SubTest>>;
}
}
如何将以下ArrayList
分配给链接List会出错。考虑到我用SubTest扩展了E,它很难理解作业。
当我有参数T t时;我可以访问t属性,但我不能做所说的assing。无论如何,List<Vector<T>>
链接无法获得ArrayList<Vector<SubTest>>
吗?
答案 0 :(得分:5)
你误解了这个错误。
实际问题是E
与SubTest
不同。
如果您创建Test<SubSubTest>
的实例(其中SubSubTest
继承SubTest
),您的代码会尝试放置SubTest
的集合(可以包含任何派生的List<Vector<SubSubTest>>
class)转换为SubSubTest
类型的变量(只能容纳{{1}})。
答案 1 :(得分:0)
根据我的经验,在类的定义中,在编译时不能使用类的实际名称来代替泛型E
。尽管E是从Subtest派生的,但E是泛型类型而Subtest是一个类。所以这个问题不是由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
的位置。
每当我声明一个具有泛型类型的类时,我就无法在声明为具有泛型类型的类的成员的位置放入实际的类名。我总是不得不使用参数,变量,ETC.使用类已定义的通用名称E.
<小时/>
根据我的经验,要分配到基于通用E的类Test
的成员变量,您必须使用与{{中的通用E'直接关联的变量1}}类。甚至来自另一个泛型类的另一个“E”也不起作用:因为其他泛型“E”不是在Test类中定义为泛型的相同泛型
答案 2 :(得分:0)
试试这个:
Test<SubTest> x = new Test<SubTest>();
x.links = MyStaticClass.aList;
您希望使用E
实例化类型参数SubTest
。这是一个合理的期望。但问题是,当使用new
关键字调用构造函数时,类型参数将被实例化。您的错误是尝试在构造函数的主体中实例化它。在构造函数的主体中,您应该将E
视为它是什么:一个尚未实例化的参数。
以后您可能希望使用E
实例化EsotericSubSubTest
。在构造函数中执行赋值,您可以将类型为ArrayList<Vector<SubTest>>
的值分配给List<Vector<EsotericSubSubTest>>
类型的字段,这绝对是错误的。