好的,这是我的问题的简化:
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/