加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

覆盖java中的列表结果类型

发布时间:2020-12-15 05:05:05 所属栏目:Java 来源:网络整理
导读:我想在 java中编译这个代码的一些变体. class X{ ListX getvalue(){...};}class Y extends X{ ListY getvalue(){...};} Javac(1.6)返回错误,因为List Y和列表 X不兼容. 关键是我想要编译器 识别List Y是一个兼容的回报 输入列表 X如果Y是X的子类型. 我想要的
我想在 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; }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读