坚持使用 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);
}
}
好的,这是我简化的问题:
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);
}
}