具有通用返回类型的覆盖方法
问题内容:
假设我有一个超类,它定义了以下抽象方法
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>