我看到这样的代码
class A implements Comparable<A> {
}
这是什么意思,它的优点和缺点是什么?
这意味着该类致力于响应由“接口” Comparable定义的方法。
这个(以及任何其他“实现”声明)的优势在于,您可以将对象的类型和代码“抽象”到接口。
考虑这个
class A implements Comparable {
....
}
class B implements Comparable {
....
}
class C implements Comparable {
....
}
然后,您可以编写可以使用Comparable而不是特定类型的代码:
public void doSomethingWith( Comparable c ) {
c.compareTo( other ); // something else...
}
并像这样调用它:
doSomethingWith( new A() );
doSomethingWith( new B() );
doSomethingWith( new C() );
因为您并不真正关心类的类型是什么,您只关心它是否实现了接口。
这(程序到接口而不是实现)是 OO 编程世界中最强大的技术之一,因为它促进了低耦合。
除了其他人所说的之外,通过实现一个接口(或扩展一个类),您可以获得超类型合同的编译器强制执行。在“Comparable”的情况下,这意味着如果您未能在实现类中实现“int compareTo(A anA)”方法,则会出现编译器错误。将注解“@Override”添加到实现方法可以提供更高的编译时安全性;如果您未能使用正确的签名实现该方法,编译器会告诉您。编译时错误比运行时错误更容易修复,也更便宜。此外,实现接口允许将实现类的任何实例视为将接口类型作为参数或泛型参数的方法(和构造函数)的接口类型。例如,'java.
http://download.oracle.com/javase/7/docs/api/java/util/Collections.html#max(java.util.Collection)
这意味着该类可以由函数操作,这些函数期望其参数是可以与相同类型的其他对象进行比较的对象(例如列表的预定义排序功能)。
实现 Comparable 接口意味着该类支持该接口所需的某些功能(特别是compareTo()
方法),在该类上执行的排序(或其他)操作将用于完成它们的工作,而不必关心其余的班级。
更多详情:http: //java.sun.com/j2se/1.4.2/docs/api/java/lang/Comparable.html
这意味着可以使用 Comparable compareTo 方法对 A 类进行排序:
A a1 = new A(1);
A a2 = new A(3);
// -1, 0, or 1 depending on whether a2 is less than, equal to, or greater than a1
int order = a1.compareTo(a2);
Comparable 为您的班级使用自然排序。
自 Java 5 以来的另一种方法是Comparator。你可以传递这个对象,并且有不止一种方法来比较和排序目标类。例如,有时您可能希望按名字对 Name 类进行排序,有时则按姓氏排序。Comparable 只为您提供了一种方法,但您可以拥有多个 Comparator 实例。
实现一个可比较的接口意味着 A 可以与 A 的其他实例进行比较。
java 中涉及排序的许多操作使用 Comparable 接口中定义的方法来确定 A 的实例是否大于或小于或等于其他实例。
通过实现这些方法,您可以使用许多方便的功能,例如 java 排序、使用 A 的实例作为二叉树的键等等。
这意味着这个类的对象可以很容易地在集合中排序,因为它们可以相互比较。另一种选择是实现一个比较器,它是一个负责对其他类进行排序的类。Comparable 将排序逻辑直接放在要排序的类中;Comparator 将排序逻辑放在不同的类中。