Java 中的泛型和排序

2022-09-03 04:00:10

假设您在Java中编写了一个静态函数来对数组进行排序,这很像。问题在于它接收到一个 Object 数组,并抛出一个 if 其元素未实现 。Arrays.sort()Arrays.sort()ClassCastExceptionComparable

因此,您希望函数以参数形式接收 子类型的数组。像这样的东西可以工作:Comparable

static <T extends Comparable> void sort(T[] array);

该签名的问题在于,您仍然可以传递一个具有整数和字符串的可比数组,这将导致 .RuntimeException

那么,如何创建一个函数,该函数将仅接收其元素实现Compeable并具有所有相同类型(例如整数,字符串等)的数组?


答案 1

static <T extends Comparable<? super T>> sort(T[] array);

这是完成任务的最通用规范。它断言,基本上,这是一种可以与自身进行比较的类型。T


答案 2

Dirk的答案是你能得到的最好的,但是Google Collections完全按照你写的使用,以避免javac中的错误:

为什么在各种API中使用该类型,而不是“完全生成”?难道不应该是 ,或者?<E extends Comparable><E extends Comparable<?>><E extends Comparable<E>><E extends Comparable<? super E>>

最后一个建议是正确的,如 Effective Java 中所述。但是,我们将使用无参数方法来解决可怕的javac错误。当您使用非常不寻常的类型(例如可与超类型相当的类型)时,这将导致您的问题。(需要更多解释。<E extends Comparable<E>>java.sql.Timestamp

寄件人: http://code.google.com/p/google-collections/wiki/Faq

现在由您决定...


推荐