java - 无法理解 Comparable<T> 转换

标签 java generics comparable

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

我的类(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 类型,则这将不会运行。我假设 number 参数在compareTo 的Comparable 版本中进行转换。因此,当我将 obj 添加到 arLst 时,该对象应该被强制转换回 T 类型,对吗? 另外,是否有更简单的方法来比较未知类型 T 的包装类对象?

最佳答案

您可以强制执行 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> .

关于java - 无法理解 Comparable<T> 转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47702409/

相关文章:

java - Hazelcast 初始化集群分区表

java - 改变一个数组中的值会改变另一个数组中的值

java - 如何在类路径中修复 "Found Netty' 的 native epoll 传输,但 epoll 不可用。使用 NIO 代替“警告?

.net - 带有 Enum 的通用 T 并将 T 转换为 Enum

java - 如何在 Java 中使用 Comparables 创建自定义参数化列表对象?

java - 为什么在 boolean 值上同步不是一个好的做法?

c# - 来自基本接口(interface)的通用类型

Java:泛型方法重载歧义

java - 比较方法(compareTo)在不同的JVM中返回不同的结果

java - 无法获得可比较的接口(interface)工作