【问题标题】:Type parameter bounds - Unchecked overriding: return type requires unchecked conversion类型参数边界 - 未经检查的覆盖:返回类型需要未经检查的转换
【发布时间】:2016-03-11 06:11:25
【问题描述】:

如何消除以下代码中的警告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);
}

【问题讨论】:

标签: java generics type-bounds


【解决方案1】:

我们可以清楚地看到,您实现的方法签名与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();
}

【讨论】:

  • 能否请您详细说明为什么原来的InterfaceImpl 没有真正实现Interface
  • 更新了更多细节。
【解决方案2】:

您完全误解了&lt;T extends B&lt;Integer&gt; &amp; A&gt; T get(); 的含义。

&lt;T extends B&lt;Integer&gt; &amp; A&gt; T get(); 声明了一个通用方法。这意味着该方法必须能够与任何T 一起正常工作——它必须与T 一起正常工作,无论任何调用者可能希望T 是什么,甚至都不知道T 是什么。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多