【问题标题】:Generics vs Object vs Comparable泛型 vs 对象 vs 可比
【发布时间】:2016-11-02 16:16:13
【问题描述】:

我很难看出何时使用泛型与何时使用 Object 之间的区别。现在我正在实现快速排序,并且已经看到使用

完成的示例

Generics - public static <T extends Comparable<T>> void qsort(T[] arr, int a, int b)
Objects - public static void quicksort(Object[] a, int left, int right)
Comparable - <T extends Comparable<T>> void sort(T[] a)

究竟有什么区别以及何时使用它们?我的目标是让最多的数据类型可以访问该类。

【问题讨论】:

  • 这是一个练习吗?如果没有,为什么不使用内置的排序方法?
  • Java generics T vs Object的可能重复
  • 你确定你在你的第三种情况下引用了正确的签名(“可比”)?它与您的“泛型”签名几乎相同,而链接指向使用原始Comparable 的源。
  • 就数组参数而言,“Generics”和“Comparable”方法之间没有任何区别。 “对象”方法只是一种糟糕的方法,可能在运行时失败,例如如果你传递一个数组new Object[] { new Object(), new Object() }。因此,就何时使用选项而言:使用 1 或 3;不要使用 2.
  • @AyoubFalah 甚至不考虑类型Comparable

标签: java types


【解决方案1】:

需要了解的概念性知识:Java 数组是协变的!

这意味着:你可以写一个类似的方法

public void sort(Object[] data)

并将其与对象数组一起使用,但也可以与 Integer[]、String[] 一起使用。

这样做的好处是您可以编写“通用”用于各种不同输入的代码。

但问题在于它可能会在运行时导致意外,例如当您的数组包含 Integer 和 String 对象时。

因此,Java 语言人员决定制作泛型,更具体地说是泛型的集合invariant。因此你不能这样做

public void sort(List<Number> numbers)

并用一些List&lt;Integer&gt; 调用它。

从这个意义上说:当使用 数组 时,使用泛型就没有多大意义了。但是:当使用泛型时,你会(大多数时候)更喜欢使用 collections 而不是数组!然后,您必须真正了解概念上的差异。

【讨论】:

  • 我不知道您为什么要尝试回答一个已经提出并得到很好回答的问题。即使是旧的答案也得到了广大社区用户的确认。
  • 在他的源代码示例中,他明确提出了数组。当你检查你作为 DUP 提出的答案时,你会发现:根本没有提到数组/方差。你看,如果我将其视为 DUP,我会投票关闭它。然后它已经被关闭了......
  • 老问题的答案足以理解编程原理并将其应用于数组。
【解决方案2】:

Object[] 只有当你想要一个混合类型的数组——一些整数、一些字符串等或支持遗留代码时才最有用。在您的情况下,这不是一个好主意(即,为什么您希望将多种类型组合在一起排序)。

更好的选择是使用通用数组。但请记住,这不允许您对原语进行排序。如果要支持原语,则需要使用方法重载。

您的第三个选项与您的第一个选项几乎相同。

【讨论】:

  • 这个问题是关于解释在 Java 中使用 Object 和 Generic 编程的区别。
  • 问题是“真正有什么区别以及何时使用它们?”在快速排序(处理数组)的上下文中。所以我认为我的回答是相关的。
猜你喜欢
  • 2017-01-28
  • 1970-01-01
  • 2011-03-14
  • 2020-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-05
相关资源
最近更新 更多