Java和可比

问题描述 投票:0回答:2

我是新来的,这是我的第一篇文章。我刚刚完成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类型作为比较任何对象的参考参数这一事实有关?

感谢您的帮助,希望我的问题有意义。

java comparable open-closed-principle
2个回答
0
投票

我的问题是为什么它不具有可比性?这与以下事实有关:调用诸如Collections.sort()之类的代码将在内部使用Comparable类型作为参考参数来比较任何对象吗?

我不确定参考参数的确切含义。

在Java中,一个类不足以在接口(或类)上提供方法的实现以成为。必须在类声明中<。


Collection

类上有两个重载的sort实用程序方法。public 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中不起作用


0
投票
Java是一种基于对象的语言。它支持通过类继承/通过类/抽象类/接口实现多态性
© www.soinside.com 2019 - 2024. All rights reserved.