Java中泛型类的比较

时间:2015-08-03 13:31:39

标签: java generics comparator

我希望以下内容有效:我有一个通用类public class TypeType<T1,T2>,它有两个字段public T1 t1public T2 t2。我想为这个类public static ComparatorcompareFirst()编写两个compareSecond()方法。我希望第一种方法仅基于t1进行比较,而第二种方法仅基于t2进行比较。第一种方法生成有效输出,如果 T1 implements Comparable<T1>,第二种如果 T2 implements Comparable<T2>

这样的事情可能吗?有没有办法检查T1T2实施Comparable?如果没有,我还能继续这项工作吗? (此类仅供内部使用。)

非常感谢!

public class TypeType<T1,T2> {

    public T1 t1;
    public T2 t2;

    public TypeType() {
        this(null, null);
    }

    public TypeType(T1 t1, T2 t2) {
        this.t1 = t1;
        this.t2 = t2;
    }

    /*
     * I know that the following does not work.
     * This is just pseudo-code for what I would like to achieve.
     */
    public static Comparator<TypeType<?,?>> comparatorFirst() {
        return new Comparator<TypeType<?,?>> {
            public int compare(TypeType<?,?> tt1, TypeType<?,?> tt2) {
                return tt1.t1.compareTo(tt2.t1);
            }
        }
    }

}

如果对其他人感兴趣:我最终使用Lambda Expressions实现了@ pbabcdefp的Java 8解决方案。

public static <T1 extends Comparable<? super T1>> Comparator<TypeType<T1,?>> compareOne() {
    return (tt1, tt2) -> tt1.t1.compareTo(tt2.t1);
}

public static <T2 extends Comparable<? super T2>> Comparator<TypeType<?,T2>> compareTwo() {
    return (tt1, tt2) -> tt1.t2.compareTo(tt2.t2);
}

public static <T1 extends Comparable<? super T1>,T2 extends Comparable<? super T2>> Comparator<TypeType<T1,T2>> compareOneThenTwo() {
    return (tt1, tt2) -> {
        if ( tt1.t1.equals(tt2.t1) )
            return tt1.t2.compareTo(tt2.t2);
        else
            return tt1.t1.compareTo(tt2.t1);
    };
}

public static <T1 extends Comparable<? super T1>,T2 extends Comparable<? super T2>> Comparator<TypeType<T1,T2>> compareTwoThenOne() {
    return (tt1, tt2) -> {
        if ( tt1.t2.equals(tt2.t2) )
            return tt1.t1.compareTo(tt2.t1);
        else
            return tt1.t2.compareTo(tt2.t2);
    };
}

5 个答案:

答案 0 :(得分:1)

instanceof运算符既可用于查看特定类是从类派生,还是类实现特定接口。

即。如果t1 instanceof Comparable实施true,则Comparable将返回Comparable

请注意,泛型在运行时不存在,因此您只能检查实现Comparable<T1>,而不是它实现app.config(function ($routeProvider) { $routeProvider .when("/Customers", { templateUrl: "app/customers-list.html", controller: "customerController" }) .when("/Contacts", { templateUrl: "app/contacts-list.html", controller: "contactController" }) .when("/Prospects", { templateUrl: "app/saleprospect-list.html", controller: "prospectController" }) .when("/Prospects/add", { templateUrl: "app/salesprospect-add.html", controller: "addController" }) .when("/Prospects/:index", { templateUrl: "app/salesprospect-add.html", controller: "editController" }) .otherwise({ redirectTo: "/Customers" })

答案 1 :(得分:1)

这应该符合您的需求:

public static <U1 extends Comparable<? super U1>, U2 extends Comparable<? super U2>> Comparator<TypeType<U1, U2>> compareFirst() {
  return new Comparator<TypeType<U1, U2>>() {

    @Override
    public int compare(TypeType<U1, U2> o1, TypeType<U1, U2> o2) {
      return o1.t1.compareTo(o2.t1);
    }

  };
}

请注意,您将无法使用TypeType个实例创建比较器,这些实例未使用不扩展Comparable的类型进行参数化。

答案 2 :(得分:1)

这里有几个很好的答案,但请注意,使用Java 8,您可以返回一个lambda。

public static <T1 extends Comparable<? super T1>> Comparator<TypeType<T1,?>> comparatorFirst() {
    return (tt1, tt2) -> tt1.t1.compareTo(tt2.t1);
}

public static <T2 extends Comparable<? super T2>> Comparator<TypeType<?, T2>> comparatorSecond() {
    return (tt1, tt2) -> tt1.t2.compareTo(tt2.t2);
}

答案 3 :(得分:0)

public static Comparator<TypeType<T1 extends Comparable<T1>,T1 extends Comparable<T2>>> comparatorFirst() {
    return new Comparator<> {
        public int compare(TypeType<T1,T2> tt1, TypeType<T1,T2> tt2) {
            return tt1.t1.compareTo(tt2.t1);
        }
    }
}

答案 4 :(得分:0)

您可以使用以下类定义来强制T1T2实现Comparable,因此您不必在运行时检查它:

public class TypeType<T1 extends Comparable<T1>, T2 extends Comparable<T2>> {
...
}