使用泛型我要完成什么?

问题描述 投票:0回答:1

我有以下代码块:

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

java generics comparable
1个回答
4
投票

说明

  • 没有泛型,您可以获得的类与其自身不具有可比性,但与其他事物不具有可比性。像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怎么样?

© www.soinside.com 2019 - 2024. All rights reserved.