【问题标题】:Why do i need comparable interface instead of creating my custom made method in java为什么我需要类似的接口而不是在 java 中创建我的自定义方法
【发布时间】:2018-10-05 11:38:51
【问题描述】:

Comparable 是一个可以实现到类中的接口,我无法理解的是为什么我需要实现该接口才能在我的类中使用Arrays.sort。我可以调用Arrays.sort,而不必在我的类中实现接口Comparable

此外,接口提供了一个空方法,以便我可以指定自己的操作。我已经阅读了有关可比较的其他答案,他们都说原因是为了让我的编码更容易。 compareTo 只是一个我必须定义的空代码,那么这有什么帮助呢,我可以定义自己的代码并将其命名为我想要的任何名称。

我很确定这背后有充分的理由。但是,我无法理解它,这真的让我感到不安,有人可以用“不是代码示例”的例子向我解释它。请用非常简单的英语解释为什么重要以及它如何节省我的时间。谢谢,提前

【问题讨论】:

  • 我可以调用 Arrays.sort 而不必实现与我的类相当的接口:不,你不能。去做吧,你会看到的。如果你不告诉它怎么做,sort() 方法将如何比较数组的元素?这就是 Comparable 的用途。就好像我让你把书分类一样。你怎么知道你是按高度、作者、标题还是页数对它们进行排序?
  • 之所以需要实现一个接口是因为Arrays.Sort必须知道调用哪个方法来执行比较,那个方法就是接口中定义的那个。
  • 还是不太清楚,接口只是我签的合同,但是声明的方法是空的,怎么能做任何事呢。我是在我的类中实现该方法之后定义该方法的人,我的意思是如果我愿意,我可以调用它任何东西,那么一个空方法究竟可以做什么或决定什么。这是我真正感到困惑的地方。
  • Arrays.sort 依赖于compareTo 方法进行排序。但是一个类通常不需要实现compareTo 方法。因此,Arrays.sort 只接受来自实现 Comparable 的类的对象。由于实现一个接口需要你实现它的所有方法,所以 sort 函数现在可以确定你传递的对象会有一个compareTo 方法,并且可以安全地调用它。
  • @salimALmughairi Declaring 在这个意义上意味着:定义名称和参数(也称为签名)。 定义意味着编写方法体(也称为实现)。 Array.sort 不调用接口的方法(这是不可能的,因为接口无法实例化),而是你在实现方法体时编写的代码。但是名称和签名与接口声明的完全一样:那是您签署的合同。

标签: java interface


【解决方案1】:

以这些数字为例:4、7、2、7、42、3、4 ,9 和 5。

假设我要求你对它们进行排序。你会怎么做?您是按升序、降序还是使用其他方法对它们进行排序。

那么答案是,你不会知道如何对它们进行排序,因为我没有为你提供足够的信息。

Arrays.sort 处于类似的未知位置。您想要求它为您排序,但简单地说,Arrays.sort知道如何排序。您必须向Arrays.sort 解释您希望如何对数组进行排序。而你向Arrays.sort解释这个的方式是实现Comparable接口。

至于这种设计如何节省您的时间。好吧,它以一种微妙的方式做到了这一点:如果你实现了Comparable,那么你会自动使用任何知道如何使用Comparable 的方法(想想算法)。这同样适用于实现其他接口。

【讨论】:

  • 谢谢,但是,您的回答对我来说并不完整,我仍然很难理解另一个类中的函数将如何强制另一个类中的函数理解某些内容并且没有明确解释这两个类如何相互关联。但它比这里的任何其他答案都更清楚,如果你愿意的话,它给了我一个开始。无论如何,谢谢。
  • 也许我不应该使用了解这个词。让我们以汽车的方向盘为例。在所有汽车中,方向盘都提供相同的界面:它允许驾驶员驾驶汽车。但是,方向盘有多种实现方式:无动力转向、(传统)动力转向和电动动力转向。打个比方,对于驱动程序来说,实现 并不重要。重要的是界面,即方向盘的使用方式,是相同的。 Arrays.sort 期望某种行为,但并不关心它是如何实现的。
【解决方案2】:

Javadoc 中指定的public static void sort(Object[] a) 方法,所有对象都必须实现Comparable 接口。这是在实现中假设的,您可以在其中找到下一行。

Comparable pivot = (Comparable) a[start];

如果您的元素没有实现可比较,则会产生运行时异常。

其他sort 方法要么用于本质上可比较的类型(例如,原始类型),要么要求您提供Comparator

【讨论】:

    【解决方案3】:

    虽然您有接受显式 ComparatorArrays.sort((T[] a, Comparator<? super T> c)) 方法,但您不希望定义内联 Comparator 或创建特殊的 Comparator 类以保持代码紧凑和可读。

    休息是你的选择。你有两种选择,选择适合你的。

    【讨论】:

      猜你喜欢
      • 2011-04-01
      • 2011-11-20
      • 2021-08-20
      • 1970-01-01
      • 2021-01-03
      • 2018-09-17
      • 2013-12-29
      • 1970-01-01
      • 2022-06-24
      相关资源
      最近更新 更多