我使用泛型完成了什么?

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.

Zab*_*uza 6

解释

  • 如果没有泛型,您可能会得到一个不能与自身相比,而是与其他事物相比的类。就像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可能不知道它在你的情况下代表什么,也许它代表一个字符,也许代表一辆车。

一般来说,尽量避免缩写。怎么样comparableselements或者items