为具有Type参数的泛型类实现Comparable接口


public class ClassX<T> implements Comparable<ClassX<T>> {
private T o;
public ClassX(T o) {
this.o = o;
}
public T getObject() {
return o;
}
public void setObject(T o) {
this.o = o;
}
@Override
public int compareTo(ClassX<T> arg0) {
return o.compareTo(arg0.o);
}
}

如果我有一个这样的类,并且我想实现Comparable接口,我读到我必须将ClassX<T>更改为ClassX<T extends Comparable<T>>。但是,如果我还想将ClassX用于不实现Comparable接口的对象,并且知道我将无法对这些对象使用compareTo((方法,该怎么办?

另一个选项是,不实现Comparable,而是使用一个返回Comparator的静态方法,并且只有在满足对T的约束时才能调用此方法。因此,您的ClassX可以与不实现ComparableT一起使用,但对于具有实现ComparableTClassX,您只能获得Comparator

public class ClassX<T> {
private T o;
// ...
public static <T extends Comparable<? super T>> Comparator<ClassX<T>> getComparator() {
return (x, y) -> x.o.compareTo(y.o);
}
}

创建另一层层次结构来支持这一点:

public class NonComparableClassX<T> implements Comparable<NonComparableClassX<T>> {
// ....
@Override
public int compareTo(ClassX<T> arg0) {
// throw Exception;
}
}
public class ClassX<T> extends NonComparableClassX<T> {
// ....
@Override
public int compareTo(ClassX<T> arg0) {
// Implement comparables here
}
}

通过这种方式,您可以将所有对象封装为ClassX,如果需要,它也可以是NonComparableClassX类型

最新更新