带有枚举比较器的摘要 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 extendsjava.util.Comparator<T>> {

这里需要 Comparable 而不是 Comparator。于是就变成了 public class TypeTypeComparator<T extendsComparable<T>> {

2nd issue
Recursive generics in Comparable forces you to use ? for generics
public static enum Comparator implementsjava.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;
                }
            };
        }
    }
}