为什么在Java中使用类似的接口?

为什么在Java中使用类似的接口?,java,comparable,Java,Comparable,我想问为什么我们在java中使用类似的接口?如果不使用可比较的接口,只创建compareTo方法不是更简单吗 而不是这样做: //some class that implements comparable public int compareTo(someClass someInstanceOfThatClass) { // do stuff that returns -1,0,or 1 } //some class that does NOT implement comparab

我想问为什么我们在java中使用类似的接口?如果不使用可比较的接口,只创建compareTo方法不是更简单吗

而不是这样做:

//some class that implements comparable

public int compareTo(someClass someInstanceOfThatClass) {
    // do stuff that returns -1,0,or 1 
}
//some class that does NOT implement comparable, but we still 
//make a compareTo method 

public int compareTo(someClass someInstanceOfThatClass) {
    // do stuff that returns -1,0, or 1
}
为什么我们不能这样做:

//some class that implements comparable

public int compareTo(someClass someInstanceOfThatClass) {
    // do stuff that returns -1,0,or 1 
}
//some class that does NOT implement comparable, but we still 
//make a compareTo method 

public int compareTo(someClass someInstanceOfThatClass) {
    // do stuff that returns -1,0, or 1
}

我想我的问题是,如果我们可以在不受某个接口(Compariable)的强制的情况下,只做一个Comparieto方法,为什么还要麻烦实现Compariable呢?

Compariable
是一个接口,因此它强加了一个其他人可能遵循的契约。例如,调用
Collections.sort(list)
仅当元素是
Comparable
的实例时有效,并且在内部依赖
compareTo
方法来实现排序。

Comparable
是一个接口,因此它强加了其他人可能遵循的契约。例如,调用
Collections.sort(list)
仅当元素是
compariable
的实例时有效,并且内部依赖
comparieto
方法来实现排序。

Java的类型系统不是,因此仅仅拥有接口所需的方法不足以实现它;您还必须声明该类实现该接口。在其他一些语言(如Typescript)中,拥有具有正确签名的方法就足够了,但Java不是这样的

如果您仅从自己的代码调用
compareTo
方法,则这可能无关紧要,但如果您使用的是标准库或其他库中的类或方法,这些库将
Comparable
作为参数,然后,您的类将需要实现接口,以便您可以将对象传递给它们。

Java的类型系统是,而不是,因此仅仅拥有接口所需的方法不足以实现它;您还必须声明该类实现该接口。在其他一些语言(如Typescript)中,拥有具有正确签名的方法就足够了,但Java不是这样的


如果您仅从自己的代码调用
compareTo
方法,则这可能无关紧要,但如果您使用的是标准库或其他库中的类或方法,这些库将
Comparable
作为参数,然后,您的类将需要实现接口,以便您可以将对象传递给它们。

我认为它回到了接口的固有概念。 您始终确保实现了可比较接口的每个类都具有可比较的能力,有时您需要这种保证。 例如,如果您有一个具有可比较类型的参数的方法,那么您可以确保comapreTo是使用该参数实现的,并且该参数是语义上可比较的。
但是没有界面你就不能得到这样的保证。

我认为它回到了界面的固有概念。 您始终确保实现了可比较接口的每个类都具有可比较的能力,有时您需要这种保证。 例如,如果您有一个具有可比较类型的参数的方法,那么您可以确保comapreTo是使用该参数实现的,并且该参数是语义上可比较的。
但是没有接口你就不能得到这个保证。

因为除非你这样做,否则没有人能调用它。@Michael这不是关于静态和动态类型的比较;这在Typescript中可以很好地工作,但Typescript也是静态类型的。它是关于名义类型和结构类型的。Java没有使用:为了使某个东西成为duck,它必须实现
duck
接口(或者扩展
duck
类)。@MIchael重复的选择非常糟糕。我肯定它是复制品,但不是那种。他没有问为什么不能叫它。他问为什么整个界面都是必需的。@kaya3我没有使用它,但据我所知,Typescript不是静态类型的,而是逐渐类型化的。类型系统是可选的。但是,是的,我确实犯了把动态和名义混为一谈的错误。因为除非你这么做,否则没有人能称之为动态。@Michael,这不是静态和动态类型的区别;这在Typescript中可以很好地工作,但Typescript也是静态类型的。它是关于名义类型和结构类型的。Java没有使用:为了使某个东西成为duck,它必须实现
duck
接口(或者扩展
duck
类)。@MIchael重复的选择非常糟糕。我肯定它是复制品,但不是那种。他没有问为什么不能叫它。他问为什么整个界面都是必需的。@kaya3我没有使用它,但据我所知,Typescript不是静态类型的,而是逐渐类型化的。类型系统是可选的。但是,是的,我确实犯了把动态和名义混为一谈的错误。这是有道理的!谢谢:)这很有道理!谢谢:)绝对有道理。我没有考虑JavaAPI中类的使用。谢谢你的回答,我不得不说你教了我一些新单词:)!我肯定会读到duck类型,名义类型和结构类型系统,等等,绝对有意义。我没有考虑JavaAPI中类的使用。谢谢你的回答,我不得不说你教了我一些新单词:)!我肯定会读到duck类型,名义类型与结构类型系统,等等。谢谢,现在绝对有意义了!谢谢你,现在肯定有道理了!