我想让以下内容奏效。我的抽象类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;
}
};
}
}
}
答案 0 :(得分:2)
您的实施中几乎没有问题,我已经为您解决了问题:)
第一期
public class TypeTypeComparator<T extends
java.util.Comparator
<T>> {
此处您需要Comparable
而不是Comparator
。所以它变成了
public class TypeTypeComparator<T extends
Comparable
<T>> {
第二期
Comparable中的递归泛型强制您使用?
进行泛型加工public static enum Comparator implements
的java.util.Comparator<TypeTypeComparator<?>>
强>
或
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;
}
};
}
}
}
答案 1 :(得分:1)
我会将Comparator<TypeTypeComparator<?>>
替换为Comparator<TypeTypeComparator>
问题是一个<?>
而另一个不等同。
BTW看起来你真的想要使用Java 8,这将使所有这些变得微不足道。 Java 7将于4月份终结。
在Java 8中,您需要一个类似于您的类,即所有代码都将消失。您可以使用内置函数,如
list.sort(comparing(Type::getField1)
.andThen(comparing(t -> getItem().getOtherField())
.andThen(comparing(Type::getField2).reversed()));