Java泛型问题

时间:2010-12-05 14:04:36

标签: java generics

我遵循班级的定义。

public class Test2<T extends Test3> {

     private T t ;


     public T foo() {
         Test3 test3 = new Test3();
         t = test3;  // I get compilation error here.**
         return t;
     }

}

class Test3 {

}

我在第t = test3行得到编译错误,说“类型不匹配无法从Test3转换为T; 有什么问题?

4 个答案:

答案 0 :(得分:8)

你正在做的事情等同于:

Integer n = new Number();

并且与泛型无关(请注意Integer extends Number)。编译器指示您不能将父类型分配给子类型的实例,父类型可能不会实现所有子类型的必需方法。

在这种情况下,TTest3Test3本身的子类型。所以在这里,您尝试将父类(T)分配给包含子类(Test3)的变量,并且失败,就像上面的示例一样。

答案 1 :(得分:2)

TTest3的子类。因此,除非它完全是Test3,否则赋值将失败,因为子类可以分配给超类类型的变量,但反之则不然。

答案 2 :(得分:1)

子对象变量可以引用父对象吗?

只需在没有泛型的情况下进行测试:

public class Foo {

    public static void main(String args[]) {
        T t = new Test3();
    }
}

class T extends Test3 {
}

class Test3 {
}

编辑:没关系,我最初发表评论,然后发布作为答案......但为时已晚! :)

答案 3 :(得分:0)

因为它是沮丧的。 T可以是从Test3派生的任何类,如果你确定(但为什么你需要T,总是使用Test3)你可以使用跟随显式转换:

@SuppressWarnings("unchecked")
t = (T)test3;