如何在以下代码中删除警告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);
}
答案 0 :(得分:2)
我们可以清楚地看到,您实施的方法签名与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();
}
答案 1 :(得分:1)
你完全误解了<T extends B<Integer> & A> T get();
的含义。
<T extends B<Integer> & A> T get();
声明泛型方法。这意味着该方法必须能够与任何T
一起正常工作 - 它必须能够正常使用T
,无论调用者可能想要T
是什么,甚至不知道是什么{{} 1}}是。
这并不意味着该方法可以选择T
成为它想要的。恰恰相反。该方法别无选择,必须使用为其选择的任何T
。