类型参数边界 - 未经检查的覆盖:返回类型需要未经检查的转换



如何在以下代码中摆脱警告Unchecked overriding: return type requires unchecked conversion. Found 'org.example.AAndB<java.lang.integer>', required 'T'.

我尝试设计一个接口(Interface),这样它就不会显式声明方法get()的返回类型(AAndB<Integer>),而是枚举结果必须实现的接口(<T extends B<Integer> & A> T)。

package org.example;
class InterfaceImpl implements Interface {
    public AAndB<Integer> get() {
        //  ^----- Unchecked overriding: return type requires unchecked conversion. Found 'org.example.AAndB<java.lang.integer>', required 'T'.
        final AAndB<Integer> aAndB = new AAndB<Integer>();
        return aAndB;
    }
}
interface Interface {
    <T extends  B<Integer> & A> T get();
}
class AAndB<T> implements A, B<T> {
    public void a() {
    }
    public void b(T t) {
    }
}
interface A {
    void a();
}
interface B<T> {
    void b(T t);
}

正如我们可以清楚地看到的,您实现的方法签名与 Interface 中的方法定义的签名不匹配:

public AAndB<Integer> get()

public <T extends B<Integer> & A> T get()

T的定义是方法签名的一部分。 为了符合Interface.get,你需要写:

class InterfaceImpl implements Interface {
    public <T extends B<Integer> & A> T get() {
        // ...
    }
}

接口的方法签名中的有界泛型并不意味着您可以在自己的方法实现中替换边界内的任何类型。

如果您希望能够指定不同的返回类型,则需要参数化Interface

class InterfaceImpl implements Interface<AAndB<Integer>> {
    public AAndB<Integer> get() {
        final AAndB<Integer> aAndB = new AAndB<Integer>();
        return aAndB;
    }
}
interface Interface<T extends B<Integer> & A> {
     T get();
}

你完全误解了<T extends B<Integer> & A> T get();的意思。

<T extends B<Integer> & A> T get();声明了一个泛型方法。这意味着该方法必须能够与任何T正常工作 - 它必须与任何调用者可能希望T成为的任何T一起工作,甚至不知道T是什么。

这并不意味着该方法可以选择T成为它想要的。恰恰相反。该方法别无选择,必须与为其选择的任何T一起使用。

最新更新