3

我试图理解以下代码。

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

    Test()
    {
        links = MyStaticClass.aList;
        // Where aList is static ArrayList<Vector<SubTest>>;
    }
}

为什么将以下内容分配ArrayList给链接列表会出错。考虑到我用 SubTest 扩展了 E,所以它理解任务。

当我有一个参数 T t; 我可以访问 t 属性,但我不能做上述评估。链接不会List<Vector<T>>期望得到ArrayList<Vector<SubTest>>吗?

4

3 回答 3

5

你误解了错误。

实际的问题是E不一样SubTest

如果您创建Test<SubSubTest>( where SubSubTestinherits SubTest) 的实例,您的代码将尝试将SubTests 的集合(可以保存任何派生类)放入类型变量List<Vector<SubSubTest>>(只能保存SubSubTest)。

于 2012-12-17T21:44:56.457 回答
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。


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

于 2012-12-17T22:25:13.397 回答
0

试试这个:

    Test<SubTest> x = new Test<SubTest>();
    x.links = MyStaticClass.aList;

你想用 实例化类型E参数SubTest。这是一个合理的期望。但问题是类型参数在使用关键字调用构造函数时被实例化。new您的错误是尝试在构造函数的主体中实例化它。在构造函数的主体中,您应该处理E它的本质:尚未实例化的参数。

稍后您可能希望E使用EsotericSubSubTest. 在构造函数中进行赋值,你会将一个类型的值赋给一个类型ArrayList<Vector<SubTest>>的字段,List<Vector<EsotericSubSubTest>>这绝对是错误的。

于 2012-12-17T22:28:59.707 回答