在java中,从可比较的意义上扩展了什么

时间:2009-08-06 01:26:44

标签: java comparable

我看到这样的代码

class A implements Comparable<A> {


}

这意味着什么,它的优点和缺点是什么?

6 个答案:

答案 0 :(得分:4)

这意味着类承诺响应“interfaceComparable定义的方法。

您对此(以及任何其他“实现”声明)的优势,您可以“abstract”对象的类型和代码的代码。

考虑一下

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() );

因为你并不真正关心类的类型,你只关心它实现了接口。

这个(接口而不是实现的程序)是面向对象编程世界中最强大的技术之一,因为它促进了low-coupling

答案 1 :(得分:1)

这意味着该类是一个可以由函数操作的类,它们希望它们的参数是可以与相同类型的其他对象进行比较的对象(例如列表的预定义排序功能)。

实现Comparable接口意味着该类支持接口所需的某些功能(特别是compareTo()方法),即在类上执行的排序(或其他)操作将用于执行其工作而不需要不得不关心班上的其他人。

了解更多详情: http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Comparable.html

答案 2 :(得分:1)

这意味着可以使用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实例。

答案 3 :(得分:1)

实现类似的界面意味着A可以与A的其他实例进行比较。

java中涉及排序的许多操作都使用Comparable接口中定义的方法来确定A的实例是否大于或小于其他实例。

通过实现这些方法,您可以使用许多方便的功能,例如java排序,使用A的实例作为二叉树的键等等。

答案 4 :(得分:1)

除了其他人所说的,通过实现接口(或扩展类),您可以获得超类型合同的编译器实施。在'Comparable'的情况下,这意味着如果您未能在实现类中实现'int compareTo(A anA)'方法,则会出现编译器错误。将注释“@Override”添加到实现方法可以提供更多的编译时安全性;如果您未能使用正确的签名实现该方法,编译器将告诉您。编译时错误比运行时错误更容易,更容易修复。此外,实现接口允许将实现类的任何实例视为将接口类型作为参数或泛型参数的方法(和构造函数)的接口类型。例如,'java.util.Collections.max(Collection coll)'方法采用一个基类型必须扩展为'Comparable'的集合。
http://download.oracle.com/javase/7/docs/api/java/util/Collections.html#max(java.util.Collection)

答案 5 :(得分:0)

这意味着可以在集合中轻松地对此类的对象进行排序,因为它们可以相互比较。另一个选项是实现Comparator,它是一个负责对其他类进行排序的类。 Comparable将排序逻辑直接放在要排序的类中;比较器将排序逻辑放在不同的类中。