假设我有一个定义以下抽象方法的超类
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)