java - 陷入 Java 接口(interface)中的比较、泛型和继承

标签 java inheritance comparable

好的,这是我的问题的简化:

class Group<T extends Comparable<T>> implements Comparable<Group<T>> {
    private String id;

    public Group(String id) {
        this.id = id;
    }

    @Override
    public int compareTo(Group<T> o) {
        return id.compareTo(o.id);
    }
}

class InnerGroup extends Group<Integer> {
    public InnerGroup(String id) {
        super(id);
    }
}

class OuterGroup extends Group<InnerGroup> {
    public OuterGroup(String id) {
        super(id);
    }
}

编译器会产生此错误:

Error:(20, 32) java: type argument InnerGroup is not within bounds of type-variable T

引用 OuterGroup 尝试扩展 Group。 ItelliJ Idea 说这是因为 InnerGroup 必须实现 Comparable,但它已经通过从 Group 继承它来实现这一点。

事实上,如果我尝试强制 InnerGroup 实现 Comparable,那么编译器会提示,因为 InnerGroup 将有两个 Comparable 的实现,这是隐式认识到它已经实现了接口(interface),尽管前面提到的提示没有它.

关于如何摆脱这个难题有什么想法吗?

提前非常感谢。

最佳答案

绑定(bind)T extends Comparable<T>意味着Group只能使用与本身相当的类型进行参数化。 InnerGroup不是有效类型,因为它只能与 Group<Integer> 进行比较。要接受与某些父类(super class)型相当的类型,您可以将约束放宽为 T extends Comparable<? super T> .

关于java - 陷入 Java 接口(interface)中的比较、泛型和继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49243097/

相关文章:

java - spring-jpa 如何在 find* 查询方法上获取 EntityNotFoundException 或类似的异常?

java - 找不到符号 - 方法错误

java - itextpdf HTML 到包含西里尔字母的 PDF

java - 如何应对以下代码中的 java.lang.NumberFormatException?

c++ - 将 dynamic_cast 与模板一起使用

c++ - 我应该如何在不使用 C++ 中的构造函数的情况下将值(而不是指针)转换为子类?

java - 如何获取抽象父类中子类被重写的内容信息

java - Comparable 比较器 Java

Java - 实现接口(interface)

java - DigestUtils 和 MessageDigest 的 MD5 结果不同