我有一个界面
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()
两个版本的界面有什么区别?我以为他们是一样的.
第二个版本的界面是错误的。它表示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不是属于接口的类型变量,仅属于方法本身。