为不可比较列表实现自然顺序比较器

Implement natural order comparator for non-comparable list

我正在为 ArrayList 的克隆实现 List 接口。我正在尝试实施 sort (source): 我不确定如何实现比较器为空的情况。我的 ArrayList 没有扩展 Comparable 因为我希望能够在列表中存储不可比较的对象。我试过对 sort 方法使用以下内容:

public void sort(Comparator<? super E> c){
    if(c == null){
        // Use ascending order
        class ascComparator<T extends Comparable<? super T>> implements Comparator<T> {
            public int compare(T a, T b) {
                return a.compareTo(b);
            }
        }
        c = new ascComparator<E>();
    }
    // Implementation of merge sort goes here
}

这预计会给出一个错误,因为 E 没有扩展 Comparable。在上面的文档中指出“如果...为空,则此列表中的所有元素都必须实现 Comparable 接口”。如何检查列表中的对象是否实现了 Comparable,然后如何使用 compareTo 而不会出现错误?有没有更好的方法来做到这一点?

你只需要进行不安全的转换。真的没办法了。

要查看 ArrayList 的作用,请尝试:

import java.util.ArrayList;
import java.util.List;

public class Test {
    public static void main(String[] args) {
        List<Object> objects = new ArrayList<>();
        objects.add(new Object());
        objects.add(new Object());

        objects.sort(null);
    }
}

您的比较器必须假设列表中的对象是可比较的,这是它能做的最好的事情:

 class ascComparator implements Comparator<Object> {
            public int compare(Object a, Object b) {
                return ((Comparable)a).compareTo(b);
            }
        }

如果列表中的项目不是 Comparable,这将抛出 ClasscastException