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

3

我想理解以下代码。

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

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

为什么将以下ArrayList分配给links列表会产生错误。考虑到我使用了SubTest扩展E,难道它不能理解这个赋值吗?

当我有一个参数T t; 我可以访问t的属性,但我无法进行上述的赋值。难道List<Vector<T>> links不应该期望获得ArrayList<Vector<SubTest>>吗?


2
类型是'E extends Subtest'而不是'Subtest'。因此,您无法确保E == Subtest,实际上它可能是Subtest的任何子类型。 - Edwin Dalorzo
为什么不直接声明 List<Vector<SubTest>> links; 呢? - Saintali
各位,请在回答之前先阅读问题。原帖并没有询问如何使其工作-问题是为什么会出现错误。这是非常不同的问题! - JoeG
3个回答

5

你误解了错误的意思。

实际问题是ESubTest不同。

如果你创建一个Test<SubSubTest>的实例(其中SubSubTest继承SubTest),你的代码将尝试把一个SubTest的集合(可以持有任何派生类)放入一个类型为List<Vector<SubSubTest>>的变量中(只能持有SubSubTest)。


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 的成员变量进行赋值,你必须使用与 Test 类中的通用类型 E 直接相关联的变量。即使来自另一种泛型类的“E”也不起作用:因为该泛型“E”不是在 Test 类中定义为泛型的相同泛型。

0

试试这个:

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

你想要用 SubTest 实例化类型参数 E,这是一个合理的期望。但问题在于类型参数在使用new关键字调用构造函数时才实例化。你的错误在于试图在构造函数体中实例化它。在构造函数体中,你应该将 E 视为尚未实例化的参数。

有可能以后你想要使用 EsotericSubSubTest 实例化 E。如果在构造函数中执行赋值操作,你会将类型为 ArrayList<Vector<SubTest>> 的值分配给类型为 List<Vector<EsotericSubSubTest>> 的字段,这肯定是错误的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接