假设我有一个父类(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>
的子类型如果
S
是T
的子类型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>