无法理解 Comparable<T> cast

Trouble Understanding Comparable<T> cast

我刚刚编写了一个方法,该方法采用两个参数:1. 扩展 Number 的任何类型的数组列表,以及 2. 相同类型的数字。此方法应该 return 一个包含小于第二个参数的所有数字的数组列表。

我的class叫Quiz3FinalQuestion<T extends Comparable>>

我写的方法是这样的,

public static <T extends Number> ArrayList<T> lessThan(ArrayList<T> lst, T number) {
        ArrayList<T> arLst = new ArrayList<>();
        for (T obj: lst) {
            if (((Comparable<T>) obj).compareTo(number) < 0)
                arLst.add(obj);
        }
        return arLst;
}

它按预期工作,但如果我没有 Java 预编译器告诉我将 obj 强制转换为 Comparable 类型,那么就不会有 运行。我假设数字参数在 compareTo 的 Comparable 版本中被强制转换。所以当我将一个 obj 添加到我的 arLst 时,该对象应该被转换回类型 T,对吗? 此外,是否有任何更简单的方法来比较未知类型 T 的包装器 class 对象?

您可以强制 T 也扩展 Comparable<? super T>:1

public static <T extends Number & Comparable<? super T>>
ArrayList<T> lessThan(ArrayList<T> lst, T number) {
    ...
}

那你就可以去掉演员表了。


1.参见例如Explanation of generic <T extends Comparable<? super T>> in collection.sort/ comparable code? 为什么我们不直接使用 Comparable<T>.