enum比较器的抽象类:如何使其工作?

时间:2015-01-22 21:39:08

标签: java enums abstract-class comparator

我想让以下内容奏效。我的抽象类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;
                }
            };
        }
    }
}

2 个答案:

答案 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()));