当使用具有具体类型的方法(满足该通用类型)来实现具有通用类型的接口方法时,将发生未经检查的覆盖警告。
这是一个示例代码:
interface SomeType{}
class Impl1 implements SomeType{}
interface SomeInterface{
<T extends SomeType> T justDoIt();
}
class SomeInterfaceImpl implements SomeInterface{
public Impl1 /*here i get the warning*/ justDoIt(){
return null;
}
}
警告说:返回类型需要未经检查的转换...任何人都可以解释一下。我知道类型擦除,但这在编译时可以验证,没有未经检查的强制转换。
重要的问题。什么是实现此目标的正确方法?鉴于我希望能够实现SomeInterface但要提供编译时具体类型的类型安全性(不使用SomeType但要使用具体SomeType后代)?
更新:这是我想做的
interface SomeType{
}
class Impl1 implements SomeType{
}
interface SomeInterface{
SomeType convert(String param);
String convert(SomeType param);
}
class SomeInterfaceImpl implements SomeInterface{
public Impl1 justDoIt(){
return null;
}
@Override
public Impl1 convert(String param) {
return null;
}
@Override
public String convert(Impl1/*compile error right here*/ param) {
return null;
}
}
我希望现在我的初衷是明确的。我需要为转换器提供通用接口...
最佳答案
您需要通用类型,而不是通用方法:
interface SomeType {
}
class Impl1 implements SomeType {
}
interface SomeInterface<T extends SomeType> {
T convert(String param);
String convert(T param);
}
class SomeInterfaceImpl implements SomeInterface<Impl1> {
@Override
public Impl1 convert(String param) {
return null;
}
@Override
public String convert(Impl1 param) {
return null;
}
}
不过,您应该问自己,在特殊情况下以这种方式使用泛型是否有意义!
SomeInterfaceImpl
的实例只能分配给SomeInterface<Impl1>
类型的字段:SomeInterface<Impl1> impl1 = new SomeInterfaceImpl();
您不允许将其分配给例如
SomeInterface<SomeType>
类型的变量:SomeInterface<SomeType> doesntWork = new SomeInterfaceImpl(); // compile error
这意味着您的代码在要使用实现的任何地方都与
SomeInterface<Impl1>
绑定。如果可以,请继续使用。