[英]Casting to generic subtypes of a generic class
假设我有这个:
class Base<T> {}
class Derived<T> extends Base<T> {}
然后在我的代码中,我可以安全地进行铸造,而不会发出如下警告:
public <T> void foo(Base<T> base) {
Derived<T> f = (Derived<T>) base; // fine, no warning
}
很好 但是,如果派生类具有更多类型参数,它将不再起作用:
class Base<T> {}
class Derived<T, U> extends Base<T> {}
public <T> void foo(Base<T> base) {
Derived<T, ?> f = (Derived<T, ?>) base; // unchecked warning!
}
这是为什么? 有什么明显的我想念的地方吗?
对我来说,这似乎是一个错误。 从JLS§5.5.2。 已检查的演员表和未检查的演员表 :
除非至少满足以下条件之一,否则不检查从类型S到参数化类型(第4.5节)T的强制转换:
S <:T
T的所有类型参数(第4.5.1节)都是无界通配符
T <:S和S除了T的类型参数中不包含X的类型参数以外,没有T的子类型X。
给定类型Base<T>
和Derived<T, ?>
分别为S
和T
,前两个条件显然不成立。
这使得第三个条件-这将不成立,如果我们能够确定的亚型Base<T>
除Derived<T, ?>
其类型参数不包含在该类型参数Derived<T, ?>
。 如果警告是正确的,则必须存在这样的子类型,但我无法确定一个。 例如, Derived<?, ?>
不起作用,因为它不是Base<T>
的子类型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.