我遵循班级的定义。
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; 有什么问题?
答案 0 :(得分:8)
你正在做的事情等同于:
Integer n = new Number();
并且与泛型无关(请注意Integer extends Number
)。编译器指示您不能将父类型分配给子类型的实例,父类型可能不会实现所有子类型的必需方法。
在这种情况下,T
是Test3
或Test3
本身的子类型。所以在这里,您尝试将父类(T
)分配给包含子类(Test3
)的变量,并且失败,就像上面的示例一样。
答案 1 :(得分:2)
T
是Test3
的子类。因此,除非它完全是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;