繁体   English   中英

转换为泛型类的泛型子类型

[英]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, ?>分别为ST ,前两个条件显然不成立。

这使得第三个条件-这将不成立,如果我们能够确定的亚型Base<T>Derived<T, ?>其类型参数不包含在该类型参数Derived<T, ?> 如果警告是正确的,则必须存在这样的子类型,但我无法确定一个。 例如, Derived<?, ?>不起作用,因为它不是Base<T>的子类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM