Java泛型问题
我遵循这个类的定义Java泛型问题,java,generics,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 { } 公共类Test2{ 私人
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 {
}
公共类Test2{
私人T;
公共图书馆{
Test3 Test3=新的Test3();
t=test3;//我在这里得到编译错误**
返回t;
}
}
类Test3{
}
我在t=test3行得到编译错误,表示“类型不匹配不能从test3转换为t;
出了什么问题?您所做的与此等效:
Integer n = new Number();
与泛型无关(请注意,Integer扩展了Number
)。编译器指示您无法将父类型分配给子类型的实例,父类型可能无法实现子类型所需的所有方法
在本例中,
T
是Test3
的子类型,或Test3
本身。因此,在这里,您试图将父类(T
)分配给包含子类(Test3
)的变量它失败了,就像上面的例子一样。T
是Test3
的一个子类。因此,除非它确实是Test3
,否则赋值将失败,因为可以将子类分配给超类类型的变量,但反之则不正确。因为它是向下转换的。T可以是从Test3派生的任何类,如果您是ure(但为什么需要T,请使用always Test3)您可以使用以下显式转换:
@SuppressWarnings("unchecked")
t = (T)test3;
子对象变量能否引用父对象 只需在没有泛型的情况下进行测试:
public class Foo {
public static void main(String args[]) {
T t = new Test3();
}
}
class T extends Test3 {
}
class Test3 {
}
编辑:没关系,我最初是作为注释发布的,然后作为答案发布的……但为时已晚!:)子对象变量可以引用父对象吗?@Hovercraft:不,它不能,这正是问题所在(请参见我的答案)。我知道那个标记,我想让OP理解它,但我是作为注释而不是答案发布的(@Hovercraft-+1感谢您在这里尝试使用苏格拉底式教学方法,并得到另一张海报的回答。这让我发笑。我想返回Test3的实例。没有泛型的书写方法是唯一的解决方案吗?如果我像下面这样施法,它会看起来很难看。@SuppressWarnings(“unchecked”)t=(t)Test3;