带有枚举比较器的摘要 Class:如何使其工作?
Abstract Class with enum Comparator: How to make it work?
我想让下面的东西起作用。我的摘要 class 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;
}
};
}
}
}
我会用 Comparator<TypeTypeComparator>
替换 Comparator<TypeTypeComparator<?>>
问题是一个 <?>
和另一个不等价。
顺便说一句,看来您真的想使用 Java 8,这将使所有这些变得微不足道。 Java 7 将在 4 月停产。
在 Java 8 中,您需要一个 class 就像您拥有的那样,即所有代码都会消失。您可以使用
等内置函数
list.sort(comparing(Type::getField1)
.andThen(comparing(t -> getItem().getOtherField())
.andThen(comparing(Type::getField2).reversed()));
您的实现过程中出现了一些问题,我已经为您解决了这些问题:)
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;
}
};
}
}
}
我想让下面的东西起作用。我的摘要 class 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;
}
};
}
}
}
我会用 Comparator<TypeTypeComparator>
替换 Comparator<TypeTypeComparator<?>>
问题是一个 <?>
和另一个不等价。
顺便说一句,看来您真的想使用 Java 8,这将使所有这些变得微不足道。 Java 7 将在 4 月停产。
在 Java 8 中,您需要一个 class 就像您拥有的那样,即所有代码都会消失。您可以使用
等内置函数list.sort(comparing(Type::getField1)
.andThen(comparing(t -> getItem().getOtherField())
.andThen(comparing(Type::getField2).reversed()));
您的实现过程中出现了一些问题,我已经为您解决了这些问题:)
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;
}
};
}
}
}