具有通用返回类型的覆盖方法


问题内容

假设我有一个超类,它定义了以下抽象方法

public abstract <T extends Interface> Class<T> getMainClass();

现在,如果我想在某些子类中覆盖它

public Class<Implementation> getMainClass(){
    return Implementation.class;
}

我收到有关类型安全和未经检查的转换的警告:

类型安全:返回类型Class<Implementation>getMainClass()从类型SubFoo需要选中转换,以符合Class<Interface>从类型SuperFoo

没有Class<Implementation>下摔倒Class<T>,如果<T extends Interface>?有什么办法可以适当消除警告吗?


问题答案:

重写方法的返回类型必须是重写方法的返回类型的子类型。

Class<Impl>不是Class<T>where 的子类型<T extends Interface>。T在这里未知。

Class<Impl>Class<? extends Interface>每个子类型化规则的的子类型。


有关通配符的一些子类型化规则:

对于任何X

  • A<X> 是…的子类型 A<? extends X>

  • A<X> 是…的子类型 A<? super X>

如果S是的子类型T

  • A<? extends S> 是…的子类型 A<? extends T>

  • A<? super T> 是…的子类型 A<? super S>

简而言之,(<:表示“是”的子类型)

A<S>    <:    A<? extends S>    <:    A<? extends T>

A<T>    <:    A<?  super  T>    <:    A<?  super  S>