Я хотел бы, чтобы следующее работало: У меня есть общий класс public class TypeType<T1,T2>
, который имеет два поля: public T1 t1
и public T2 t2
. Я хотел бы написать два метода public static Comparator
для этого класса, compareFirst()
и compareSecond()
. Я хотел бы, чтобы первый метод сравнивался только на основе t1
s, а второй - только на основе t2
s. Первый метод дает допустимый выход , еслиT1 implements Comparable<T1>
и второй , еслиT2 implements Comparable<T2>
.Компаратор класса generic в Java
Возможно ли это как можно? Есть ли способ проверить, что 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);
}
}
}
}
В случае интересно другим: я в конечном итоге реализации решения @ 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);
};
}
возвращаемый тип будет что-то вроде 'Comparator,? >>' –
njzk2
вы должны быть общие объекты всегда иметь Сопоставимые реализованы или делать это необходимо с обоих случаях делать? Технически вам не нужны дженерики, если вы хотите, чтобы это были объекты «Comparable», просто попросите интерфейс в конструкторе – engineercoding