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

时间:2012-12-17 21:42:07

标签: java generics types

我试图理解以下代码。

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>>吗?

3 个答案:

答案 0 :(得分:5)

你误解了这个错误。

实际问题是ESubTest不同。

如果您创建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>>类型的字段,这绝对是错误的。