我是新来的,这是我的第一篇文章。我刚刚完成Java OCA,现在开始学习OCP。我对可比接口有疑问。
我有此代码段,解释了如何实现Comparable:
import java.util.*;
public class Duck implements Comparable<Duck> {
private String name;
public Duck(String name) {
this.name = name;
}
public String toString() { // use readable output
return name;
}
public int compareTo(Duck d) {
return name.compareTo(d.name); // call String's compareTo
}
public static void main(String[] args) {
List<Duck> ducks = new ArrayList<>();
ducks.add(new Duck("Quack"));
ducks.add(new Duck("Puddles"));
Collections.sort(ducks); // sort by name
System.out.println(ducks); // [Puddles, Quack]
}
}
我或多或少都了解这里发生了什么,但是在此代码段下方,作者引用了以下内容:
Duck类实现Comparable接口。如果不实现该接口,我们所拥有的只是一个名为compareTo()的方法,但它不是Comparable对象。
我的问题是为什么它不具有可比性?这是否与调用代码(例如Collections.sort()
)将内部使用Comparable类型作为比较任何对象的参考参数这一事实有关?
感谢您的帮助,希望我的问题有意义。
我的问题是为什么它不具有可比性?这与以下事实有关:调用诸如Collections.sort()之类的代码将在内部使用Comparable类型作为参考参数来比较任何对象吗?
我不确定参考参数的确切含义。
在Java中,一个类不足以在接口(或类)上提供方法的实现以成为。必须在类声明中<。 Collectionpublic static <T extends Comparable<? super T>> void sort(List<T> list)
public static <T> void sort(List<T> list, Comparator<? super T> c)
[当您的类实现。在这种情况下,您将被迫传递一个明确的Comparable
时,您可以在第一个方法中仅传递该类的对象列表。如果未实现Comparable
,则不会编译,因为T
的边界必须extend
Comparable
Comparator
来比较对象。正如该书的作者所提到的,拥有一个其签名与任意接口(或类)中的方法相同的方法,不会使其具有这种类型。[Duck Typing在Java中不起作用