我希望以下内容有效:我有一个通用类public class TypeType<T1,T2>
,它有两个字段public T1 t1
和public T2 t2
。我想为这个类public static Comparator
和compareFirst()
编写两个compareSecond()
方法。我希望第一种方法仅基于t1
进行比较,而第二种方法仅基于t2
进行比较。第一种方法生成有效输出,如果 T1 implements Comparable<T1>
,第二种如果 T2 implements Comparable<T2>
。
这样的事情可能吗?有没有办法检查T1
和T2
实施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);
};
}
答案 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)
您可以使用以下类定义来强制T1
和T2
实现Comparable
,因此您不必在运行时检查它:
public class TypeType<T1 extends Comparable<T1>, T2 extends Comparable<T2>> {
...
}