覆盖java中的列表结果类型

我想在 java中编译这个代码的一些变体.

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

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

Javac(1.6)返回错误,因为List< Y>和列表< X>不兼容.

关键是我想要编译器
识别List< Y>是一个兼容的回报
输入列表< X>如果Y是X的子类型.
我想要的原因是简化用户定义的工厂类的使用.

注意:这个问题有点像
this question
但对于java.

解决方法

在Java中,重写方法的返回类型必须与被覆盖的方法的返回类型协变.

类java.util.List不是协变的(实际上,没有java类.这是因为缺少声明 – 站点方差注释).换句话说,B<:A并不意味着List< B>. <:List< A> (读&lt ;: as as-subtype-of).因此,您的代码不会进行类型检查.

在Java中,您有定义 – 站点差异.因此,以下是typechecks:

import java.util.List;

class X {
  List<? extends X> getvalue() { return null; }
}

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

相关文章

HashMap是Java中最常用的集合类框架,也是Java语言中非常典型...
在EffectiveJava中的第 36条中建议 用 EnumSet 替代位字段,...
介绍 注解是JDK1.5版本开始引入的一个特性,用于对代码进行说...
介绍 LinkedList同时实现了List接口和Deque接口,也就是说它...
介绍 TreeSet和TreeMap在Java里有着相同的实现,前者仅仅是对...
HashMap为什么线程不安全 put的不安全 由于多线程对HashMap进...