[英]Abstract Class with enum Comparator: How to make it work?
我想使以下事情起作用。 我的抽象類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;
}
};
}
}
}
您的實現中存在的問題很少,我已經為您解決了問題:)
第一期
public class TypeTypeComparator<T extends
java.util.Comparator
<T>> {
您在這里需要Comparable
而不是Comparator
。 因此它成為public class TypeTypeComparator<T extends
Comparable
<T>> {
第二期
可比較的遞歸泛型迫使您使用?
對於仿制葯
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;
}
};
}
}
}
我將Comparator<TypeTypeComparator<?>>
替換為Comparator<TypeTypeComparator>
。問題是一個<?>
和另一個不相等。
順便說一句,您似乎真的想使用Java 8,這會使所有這些事情變得微不足道。 Java 7將於4月終止。
在Java 8中,您將需要一個類似的類,即所有代碼都將消失。 您可以使用諸如
list.sort(comparing(Type::getField1)
.andThen(comparing(t -> getItem().getOtherField())
.andThen(comparing(Type::getField2).reversed()));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.