覆盖泛型返回类型的方法

alh*_*001 6 java generics

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

public abstract <T extends Interface> Class<T> getMainClass();
Run Code Online (Sandbox Code Playgroud)

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

public Class<Implementation> getMainClass(){
    return Implementation.class;
}
Run Code Online (Sandbox Code Playgroud)

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

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

如果不Class<Implementation>属于?有没有办法正确摆脱警告?Class<T><T extends Interface>

irr*_*ble 12

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

Class<Impl>不是Class<T>哪里的子类型<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>
Run Code Online (Sandbox Code Playgroud)

  • 有[Angelika Langer的泛型常见问题](http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html) - 它涵盖了几乎所有的边缘情况,但每个部分(相对)容易接受和理解. (2认同)