我希望这段代码的一些变体可以在 java 中编译。
class X
{
List<X> getvalue(){...};
}
class Y extends X
{
List<Y> getvalue(){...};
}
Javac (1.6) 返回错误,因为 List
重点是我希望编译器
认识到 List
注:这题有点像 this question 但对于 Java。
最佳答案
在 Java 中,覆盖方法的返回类型必须与被覆盖方法的返回类型协变。
类(class)java.util.List
不是协变的(事实上,没有 Java 类是协变的。发生这种情况是因为缺少声明站点方差注释)。换句话说,B <: A
并不意味着 List<B> <: List<A>
(阅读 <:
作为子类型)。因此,您的代码不会进行类型检查。
在 Java 中,您有定义站点差异。因此进行以下类型检查:
import java.util.List;
class X {
List<? extends X> getvalue() { return null; }
}
class Y extends X {
List<Y> getvalue() { return null; }
}
关于java - 在java中覆盖列表结果类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3687814/