我想创建一个只接受特定类的容器。使用泛型如下:Java泛型:通配符
static class Test1<C extends Test1> {
C field = null;
public C getField() {
return field;
}
public void setField(C field) {
this.field = field;
}
}
static class Test2 extends Test1{
}
class MainTest {
public static void main(String[] args) throws Exception {
List<Test1<? extends Test1>> list = new ArrayList<Test1<? extends Test1>>();
Test1<Test2> newInstance = new Test1<Test2>();
list.add(newInstance);
Test1<Test2> value = list.get(1);
}
}
只是想了解为什么这个名单>愿意接受的newInstance对象,但编译时错误,而我取“的Test1值”后发生? 是否有任何解决该问题的机会?
在此先感谢。
UPDATE 许多人注意到“Test1<? extends Test1>
,其中?可能不等于Test2”。 我完全同意,但据我所知,在这种情况下,我需要键入提取的值到Test1<Test2>
,这意味着在这种情况下泛型的全部内容都会丢失......如果我错了,请纠正我。
你为什么不宣布名单的'名单> list'? –
BalusC
2011-12-28 15:38:47
'Test1'是'Test1 <?扩展Test1 >>',但Test1 <?扩展Test1 >>'不是'Test1 '的一个实例。 (你也有罕见的类型 - 混合的通用类型和原始类型 - 这是个坏消息。) –
2011-12-28 15:41:14
我希望列表包含Test1的所有组合,其中包含它的任何后代。 – user1119571 2011-12-28 15:41:47