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

标签 java generics list overriding

我希望这段代码的一些变体可以在 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/

相关文章:

java - 如何在 Struts 2 中处理表单上的索引属性按钮

java - 如何打印由用户输入确定大小的可缩放金字塔?

java - 如何从 linkedhashmap 列表中单独获取 linkedhashmap

单个方法中不同对象的 Java 泛型

generics - 在不固定 `Fn` 参数之一的情况下,在结构定义上指定 `Fn` trait bound

Python 将字符串转换为字符串列表的列表

python - 通过传递列表作为键参数,使用sorted() 对列表进行排序

java - 使用 NIO 浮点缓冲区在 Java 中进行快速 4x4 矩阵乘法

java - SQLite 减少 for 循环时间

java - 如何使用不同的比较器创建通用结构的两个实例?