gpt4 book ai didi

java - 在java中覆盖列表结果类型

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:31:31 24 4
gpt4 key购买 nike

我希望这段代码的一些变体可以在 java 中编译。

class X
{
List<X> getvalue(){...};
}

class Y extends X
{
List<Y> getvalue(){...};
}

Javac (1.6) 返回错误,因为 List 和 List 不兼容。

重点是我希望编译器认识到 List 是一个兼容的返回如果 Y 是 X 的子类型,则类型为 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com