假设我有一个父类(super class),它定义了以下抽象方法

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

现在,如果我想在某些子类中覆盖它
public Class<Implementation> getMainClass(){
    return Implementation.class;
}

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



如果Class<Implementation>Class<T>不会落在<T extends Interface>之下吗?有什么方法可以正确消除警告吗?

最佳答案

重写方法的返回类型必须是重写方法的返回类型的子类型。
Class<Impl>不是Class<T>的子类型,其中<T extends Interface>。 T在这里未知。

按照子类型化规则,Class<Impl>Class<? extends Interface>的子类型。

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

对于任何X类型

  • A<X>A<? extends X>的子类型
  • A<X>A<? super X>的子类型

  • 如果ST的子类型
  • A<? extends S>A<? extends T>的子类型
  • A<? super T>A<? super S>的子类型

  • 简而言之,(<:的意思是"is"的子类型)
    A<S>    <:    A<? extends S>    <:    A<? extends T>
    
    A<T>    <:    A<?  super  T>    <:    A<?  super  S>
    

    10-07 19:05
    查看更多