我想让以下事情发挥作用。我的抽象类T
延伸java.util.Comparator<T>
因此应该允许我使用 compareTo
方法。问题是o1.t1.compareTo(o2.t1)
收到The method compareTo(capture#2-of ?) is undefined for the type capture#1-of ?
有人可以从基本层面解释一下这个问题并告诉我如何解决它吗?预先非常感谢。
public class TypeTypeComparator<T extends java.util.Comparator<T>> {
public T t1;
public T t2;
public TypeTypeComparator() {
this.t1 = null;
this.t2 = null;
}
public TypeTypeComparator(T t1, T t2) {
this.t1 = t1;
this.t2 = t2;
}
public static enum Comparator implements java.util.Comparator<TypeTypeComparator<?>> {
T1_SORT {
public int compare(TypeTypeComparator<?> o1, TypeTypeComparator<?> o2) {
return o1.t1.compareTo(o2.t1);
}},
T2_SORT {
public int compare(TypeTypeComparator<?> o1, TypeTypeComparator<?> o2) {
return o1.t2.compareTo(o2.t2);
}};
public static java.util.Comparator<TypeTypeComparator<?>> getComparator(final Comparator... options) {
return new java.util.Comparator<TypeTypeComparator<?>>() {
public int compare(TypeTypeComparator<?> o1, TypeTypeComparator<?> o2) {
for ( Comparator option : options ) {
int result = option.compare(o1, o2);
if ( result != 0 )
return result;
}
return 0;
}
};
}
}
}
最佳答案
您的实现过程中出现了一些问题,我已经为您解决了这些问题:)
1st issue
public class TypeTypeComparator<T extends
java.util.Comparator
<T>> {
您需要Comparable
这里而不是 Comparator
这里。所以就变成了
public class TypeTypeComparator<T extends
<强> Comparable
<T>> {
2nd issue
Recursive generics in Comparable forces you to use?
for generics
public static enum Comparator implements
java.util.Comparator<TypeTypeComparator<?>>
or
public static enum Comparator implements java.util.Comparator<
TypeTypeComparator<Comparable<?>>
>
您将再次需要输入 ?
由于 Comparable 中的递归泛型声明,因此我建议您解析 Comparable
的递归泛型如下:
interface Comp extends java.lang.Comparable<Comp> {}
现在您需要替换所有 ?
与 Comp
你就完成了。
这是完整的实现:
interface Comp extends Comparable<Comp> {}
public class TypeTypeComparator<T extends Comp> {
public T t1;
public T t2;
public TypeTypeComparator() {
this.t1 = null;
this.t2 = null;
}
public TypeTypeComparator(T t1, T t2) {
this.t1 = t1;
this.t2 = t2;
}
public static enum Comparator implements java.util.Comparator<TypeTypeComparator<Comp>> {
T1_SORT {
@Override
public int compare(TypeTypeComparator<Comp> o1,
TypeTypeComparator<Comp> o2) {
return o1.t1.compareTo(o2.t1);
}
},
T2_SORT {
@Override
public int compare(TypeTypeComparator<Comp> o1,
TypeTypeComparator<Comp> o2) {
return o1.t2.compareTo(o2.t2);
}
};
public static java.util.Comparator<TypeTypeComparator<Comp>> getComparator(final Comparator... options) {
return new java.util.Comparator<TypeTypeComparator<Comp>>() {
public int compare(TypeTypeComparator<Comp> o1, TypeTypeComparator<Comp> o2) {
for ( Comparator option : options ) {
int result = option.compare(o1, o2);
if ( result != 0 )
return result;
}
return 0;
}
};
}
}
}
关于java - 带有枚举比较器的抽象类 : How to make it work?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28099179/