Arh*_*qui 0 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) { }
Run Code Online (Sandbox Code Playgroud)
我使用泛型到底要完成什么?这些都没有编译错误。我仍然可以使用 compareTo 方法。那么我得到的是什么E extends Comparable<E>而不是仅仅使用Comparable?
这个问题的上下文是我让排序算法使用E extends Comparable<E>而不是Comparable.
如果没有泛型,您可能会得到一个不能与自身相比,而是与其他事物相比的类。就像A implements Comparable<B>,这是不寻常的但可能的。
此外,您只会在 上失去类型安全性compareTo,因为它随后会回退到接受Objects。所以你可能会不小心犯错,传递错误的东西,Java 无法帮助你和防止它。
实际上,如果您不是被迫为早于 Java 5 进行开发,则没有理由考虑使用原始类型(放弃泛型)。
一个例子,考虑你的片段,你传递Integer[]给它。AnInteger不能与Dogs相比。所以如果你不小心做了一些愚蠢的事情,比如:
Dog dog = new Dog();
if (c[0].compareTo(dog) == 0) { ... }
Run Code Online (Sandbox Code Playgroud)
这实际上将使用带有 的变体进行编译Comparable[],但在您执行它时会在运行时崩溃。另一个变体能够在编译时检测到此错误,并且通常可以帮助您更早地发现错误,这很好。
这个例子可能看起来很人为,但这样的事情可能会很快发生。
您可能需要考虑将您的重命名c为有助于提高可读性的名称。读 a 的人c可能不知道它在你的情况下代表什么,也许它代表一个字符,也许代表一辆车。
一般来说,尽量避免缩写。怎么样comparables,elements或者items。