我使用泛型能完成什么工作?

时间:2020-02-28 20:35:25

标签: java generics comparable

我有以下代码块:

public static void main(String[] args) {
    Integer[] test = new Integer[100];
    comparableTest(test);
    genericsTest(test);
}

private static void comparableTest(Comparable[] c) {

}

private static <E extends Comparable<E>> void genericsTest(E[] e) { }

使用泛型到底能完成什么工作?这些都没有编译错误。我仍然可以使用compareTo方法。那么,使用E extends Comparable<E>而不是仅仅使用Comparable有什么好处?

此问题的上下文是我正在使排序算法使用E extends Comparable<E>而不是Comparable

1 个答案:

答案 0 :(得分:6)

说明

  • 没有泛型,您可能会得到一个与自身不具有可比性的类,但与其他事物不具有可比性。像A implements Comparable<B>一样,这很罕见,但可能。

  • 此外,您只是失去了compareTo的类型安全性,因为它随后又退回到接受Object的位置。这样一来,您可能会不小心犯了一个错误,传递了错误的内容,而Java无法帮助您并防止它发生。

实际上,如果您没有被迫开发Java 5之前的版本,则没有理由不考虑使用原始类型(删除泛型)。


示例

一个示例,考虑您的代码片段,您将Integer[]传递到其中。 Integer无法与Dog进行比较。因此,如果您不小心做了一些愚蠢的事情,例如:

Dog dog = new Dog();
if (c[0].compareTo(dog) == 0) { ... }

这实际上将与采用Comparable[]的变体一起编译,但是在执行时会在运行时崩溃。另一个变体能够在编译时检测到此错误,并且通常可以帮助您更早地发现错误,这很好。

此示例可能看起来很虚构,但是类似的事情可能会很快发生。


注意

您可能需要考虑将c重命名为有助于提高可读性的内容。读c的人可能不知道它在您的情况下代表什么,也许它代表角色,也许是汽车。

通常,请尽量避免缩写。 comparableselementsitems怎么样?