【问题标题】:Trouble Understanding Comparable<T> cast无法理解 Comparable<T> 演员表
【发布时间】:2017-12-07 19:28:57
【问题描述】:

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

我的班级叫Quiz3FinalQuestion&lt;T extends Comparable&gt;&gt;

我写的方法是这样的,

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 版本中被强制转换。因此,当我向我的 arLst 添加一个 obj 时,该对象应该被转换回类型 T,对吧? 另外,有没有更简单的方法来比较未知类型 T 的包装类对象?

【问题讨论】:

  • 我可能遗漏了一些东西,但是这段代码有什么特定于 Java 8 的吗?

标签: java generics comparable


【解决方案1】:

您可以强制 T 也扩展 Comparable&lt;? super T&gt;:1

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

然后你就可以移除演员表了。


1。参见例如Explanation of generic &lt;T extends Comparable&lt;? super T&gt;&gt; in collection.sort/ comparable code? 为什么我们不只使用 Comparable&lt;T&gt;

【讨论】:

  • 或者更好,它应该扩展Comparable&lt;? super T&gt;
  • @newacct - 确实应该:)
猜你喜欢
  • 2013-01-28
  • 1970-01-01
  • 2015-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多