坚持使用 Java 接口 Comparable、泛型和继承

Stuck with Java interface Comparable, generics and inheritance

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

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。 ItelliJ Idea 说是因为 InnerGroup 必须实现 Comparable,但它已经通过从 Group 继承它来实现了。

事实上,如果我试图强制 InnerGroup 实现 Comparable,那么编译器会报错,因为 InnerGroup 将有两个 Comparable 的实现,这是一种隐含的承认,它已经实现了接口,尽管前面提到了 not有了它。

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

非常感谢。

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

我想我已经一劳永逸地解决了这个问题。当事情变得有点复杂时,@shmosel 的解决方案会产生一些副作用,一旦我设法完全掌握它,我认为它并没有准确表达我想要的东西。但是,应该这样做:

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

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

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

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

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