ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java – 继承Compable与泛型

2019-06-28 09:48:53  阅读:171  来源: 互联网

标签:java comparable generics


试图设计一个超类,确保所有子类本身都是可比较的.

/**
 * A base class implementing Comparable with itself by delegation.
 * @param <T> - The type being wrapped.
 */
static class Distinct<T extends Comparable<T>> implements Comparable<Distinct<T>> {
    final T it;
    public Distinct(T it) {
        this.it = it;
    }
    @Override
    public int compareTo(Distinct<T> o) {
        return it.compareTo(o.it);
    }
}
/**
 * A set of distinct items.
 *
 * @param <T>
 */
static class ThingHolder<T extends Comparable<T>> {
    final Set<T> things;
    public ThingHolder() {
        this.things = new TreeSet<>();
    }
}
/**
 * A sample real thing.
 */
static class Thing extends Distinct<String> {
    public Thing(String it) {
        super(it);
    }
}
// This doesn't work - Why?
final ThingHolder<Thing> yz = new ThingHolder<>();

我得到的错误是:

com/oldcurmudgeon/test/Test.java:[70,22] error: type argument Thing is not within bounds of type-variable T
  where T is a type-variable:
    T extends Comparable<T> declared in class ThingHolder

为什么这不起作用?可以吗?

解决方法:

>如果将类型参数X传递给ThingHolder,则它必须是Comparable< X>的子类型. (通过ThingHolder的类声明).
>因此,如果你将Thing类型传递给ThingHolder,它必须是Comparable< Thing>的子类型. (根据之前的陈述,将Thing替换为X.)
> Thing扩展Distinct< String>因此实现了Comparable< Distinct< String>> (通过Thing的类声明).
> Thing与Distinct< String>的类型不同 – 虽然它是一个子类型 – 因此类型匹配失败.

你可以通过调整ThingHolder的类声明来解决这个问题,如下所示:

class ThingHolder<T extends Comparable<? super T>> {
    ...
}

标签:java,comparable,generics
来源: https://codeday.me/bug/20190628/1314232.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有