我有以下代码块:
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
。
没有泛型,您可以获得的类与其自身不具有可比性,但与其他事物不具有可比性。像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
的人可能不知道它在您的情况下代表什么,也许它代表角色,也许是汽车。
[通常,请避免缩写。 comparables
,elements
或items
怎么样?