2

如何摆脱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);
}
4

2 回答 2

3

我们可以清楚地看到,您实现的方法签名与以下方法定义的签名不匹配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();
}
于 2016-03-09T20:41:46.697 回答
2

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

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

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

于 2016-03-10T22:11:25.620 回答