Java Generics:警告需要未经检查的强制转换以符合<InterfaceName>

Sur*_*rya 5 java generics

我有一个界面

interface x {
    A getValue();
}
Run Code Online (Sandbox Code Playgroud)

和实施

class y implements x {
    public B getValue() { return new B();}
}
Run Code Online (Sandbox Code Playgroud)

B是A的子类.我猜这是因为协变覆盖的原因.

但是,如果我重写接口为

interface x{
    <T extends A> T getValue();
}
Run Code Online (Sandbox Code Playgroud)

我在实施中得到了一个警告

警告需要未经检查的强制转换以符合A.getValue()

两个版本的界面有什么区别?我以为他们是一样的.

wax*_*ing 4

第二个版本的界面是错误的。它表示getValue将返回您要求的任何子类 - 返回类型将根据您左侧的表达式推断。

因此,如果您获得对 an 的引用x(我们称之为obj),您可以合法地进行以下调用,而不会出现编译器警告:

x obj = ...;
B b = obj.getValue();
Run Code Online (Sandbox Code Playgroud)

在您的示例中这可能是不正确的,因为如果您添加另一个C也扩展的类A,您也可以合法地进行调用:

C c = obj.getValue();
Run Code Online (Sandbox Code Playgroud)

这是因为T不是属于接口的类型变量,仅属于方法本身。