java – Comparable vs Raw Comparable

我最近写了一个简单的通用选择排序方法来获得它的乐趣,当我对某些东西感到有些困惑时.这是我的代码:

public static <T extends Comparable<T>> void sort(List<T> list) {
    for (int i = 0; i < list.size(); i++) {
        int minIndex = i; // Assume that the first element is the minimum for now.

        // Find smallest element in unsorted sub-list.
        for (int k = i + 1; k < list.size(); k++) {
            if (list.get(k).compareTo(list.get(minIndex)) < 0) {
                minIndex = k;
            }
        }

        // Swap smallest element with the first element in unsorted sub-list.
        T temp = list.get(i);
        list.set(i, list.get(minIndex));
        list.set(minIndex, temp);
    }
}

函数本身工作正常,但我对泛型有点困惑.我用:

<T extends Comparable<T>>

确保给定的List具有可比较的类型.但是,如果我使用原始的Comparable呢?那是:

<T extends Comparable>

究竟会产生什么影响?

谢谢!

解决方法:

基本上,你失去了一些类型的安全.

如果你有T temp = list.get(i),你可以用temp.compareTo做什么?

>使用T扩展Comparable< T>,temp是Comparable< T>,这意味着你只能将另一个T传递给compareTo
>使用T extends Comparable,temp是Comparable,这意味着你可以将任何东西传递给compareTo

第一个几乎肯定是你想要的,因为类似的类型只能处理相同类型的对象.例如,String.compareTo只能处理String输入 – 如果你传入一个Integer,你将得到一个ClassCastException.

鉴于temp.compareTo的唯一安全输入是类型T的引用,通常没有充分的理由使用原始类型.它偶尔会有助于绕过类型系统,但在大多数情况下,它会消除类型安全,而不会给你任何回报.

上一篇:java中的接口与C++的多继承


下一篇:Java 在使用Conllections中的bianarySeach ()方法时报错 no instance(s) of type vaiable(s) T text so that Student