使用 Type 参数为泛型 class 实现 Comparable 接口
Implementing Comparable interface for a generic class with Type parameter
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);
}
}
如果我有这样的 class 并且我想实现 Comparable 接口,我读到我必须将 ClassX<T>
更改为 ClassX<T extends Comparable<T>>
。但是,如果我还想将我的 ClassX 用于未实现 Comparable 接口的对象,并且知道我将无法对这些对象使用方法 compareTo() 怎么办?
如何创建另一层层次结构来支持这一点:
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类型
另一种选择是,不实现 Comparable
,而是使用 returns 和 Comparator
的静态方法,并且此方法只能在 [=13= 上的约束时调用] 满足。因此,您的 ClassX
可以与未实现 Comparable
的 T
一起使用,但您只能为 ClassX
和 [=13= 获得 Comparator
s ] 执行 Comparable
.
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 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);
}
}
如果我有这样的 class 并且我想实现 Comparable 接口,我读到我必须将 ClassX<T>
更改为 ClassX<T extends Comparable<T>>
。但是,如果我还想将我的 ClassX 用于未实现 Comparable 接口的对象,并且知道我将无法对这些对象使用方法 compareTo() 怎么办?
如何创建另一层层次结构来支持这一点:
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类型
另一种选择是,不实现 Comparable
,而是使用 returns 和 Comparator
的静态方法,并且此方法只能在 [=13= 上的约束时调用] 满足。因此,您的 ClassX
可以与未实现 Comparable
的 T
一起使用,但您只能为 ClassX
和 [=13= 获得 Comparator
s ] 执行 Comparable
.
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);
}
}