簡體   English   中英

帶有枚舉比較器的抽象類:如何使其工作?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM