我习惯于java泛型,例如。
class B {}
class A<T extends B> {
T t;
T getT() {
return t;
}
}
下面这段代码在这种情况下到底是什么意思?
class C {
A<?> a;
A<?> getA() {
return a;
}
}
代码可以编译,但我想知道为什么使用 A<?>
? 我希望编译器会抱怨 A
必须以相同的方式在属性级别上使用( a1
)或者在班级里( a2
):
class C<T extends B> {
A<? extends B> a1;
A<? extends B> getA1() {
return a1;
};
A<T> a2;
A<T> getA2() {
return a2;
}
}
我猜是这样的 A<?>
只是句法上的糖分,但意思等于 A<? extends B>
? 然而,许多关于堆栈溢出的答案都是关于表示法的 Something<?>
手段 Something<? extends Object>
这就意味着所有这些答案都是错误的?
但不可能指定 A<?>
将变量类型化为 A<? extends B>
,这表明编译器不知道不可能创建 A<X>
哪里 X
不是的子类 B
.
理论上 A<?>
只是表示未知的类型参数,但是编译器仍然应该知道,由于a的类型参数定义,类型参数必须是b的子类。但编译器似乎没有考虑到这一点?为什么?
暂无答案!
目前还没有任何答案,快来回答吧!