为什么在Java中使用类似的接口?
我想问为什么我们在java中使用类似的接口?如果不使用可比较的接口,只创建compareTo方法不是更简单吗 而不是这样做:为什么在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
//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类型,名义类型与结构类型系统,等等。谢谢,现在绝对有意义了!谢谢你,现在肯定有道理了!