java - 类型参数范围 - 未检查覆盖 : return type requires unchecked conversion

标签 java generics type-bounds

我怎样才能摆脱警告 Unchecked overriding: return type requires unchecked conversion. Found 'org.example.AAndB<java.lang.integer>', required 'T'.在下面的代码中。

我尝试设计一个接口(interface) ( Interface ),使其不会显式声明方法的返回类型 get() ( AAndB<Integer> ) 而是枚举结果必须实现的接口(interface) ( <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)方法签名中的有界泛型并不意味着您可以替换您自己的方法实现中范围内的任何类型。

如果希望能够指定不同的返回类型,需要参数化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();
}

关于java - 类型参数范围 - 未检查覆盖 : return type requires unchecked conversion,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35900520/

相关文章:

java - Netty 代理复制流量

ios - Swift 4 泛型数组作为泛型类中的参数

c# - 使用比我需要调用的方法更少受约束的泛型类型实现接口(interface)

scala - 类型上限允许子类型但不允许父类型

java - 在下面的示例中, "List<? extends T>"是必要的吗?或者 "List<T>"会做同样的事情吗?

java - 在android中解析xml文件

java - java.util.Stack.clear() 的性能

java - java子串方法中的OR条件

java - 解析Java中的泛型函数

scala - 如何在编译时要求类型参数是特征(而不是类或其他类型值)?