我有以下代码块:
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
。
答案 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
的人可能不知道它在您的情况下代表什么,也许它代表角色,也许是汽车。
通常,请尽量避免缩写。 comparables
,elements
或items
怎么样?