当使用具有具体类型的方法(满足该通用类型)来实现具有通用类型的接口方法时,将发生未经检查的覆盖警告。

这是一个示例代码:

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>绑定。如果可以,请继续使用。

10-07 22:21