【问题标题】:static <T extends Number & Comparable<? super Number>>静态 <T 扩展数字和可比值<?超级号>>
【发布时间】:2011-12-19 10:41:08
【问题描述】:

我有以下类和一个静态方法:

public class Helper {

    public static <T extends Number & Comparable<? super Number>> Boolean inRange(T value, T minRange, T maxRange) {
        //  equivalent (value >= minRange && value <= maxRange)
        if (value.compareTo(minRange) >= 0 && value.compareTo(maxRange) <= 0)
            return true;
        else
            return false;
    }

}

我尝试调用这个方法:

Integer value = 2;
Integer min = 3;
Integer max = 8;
Helper.inRange(value, min, max) ;

Netbeans 编译器向我显示此错误消息:

Helper 类中的方法 inRange 不能应用于给定类型; 必需:T,T,T 找到:java.lang.Integer,java.lang.Integer,java.lang.Integer 原因:推断类型不符合声明的边界 推断:java.lang.Integer 绑定:java.lang.Number,java.lang.Comparable

有什么想法吗?

谢谢。

【问题讨论】:

    标签: java generics methods static call


    【解决方案1】:

    试试&lt;T extends Number &amp; Comparable&lt;T&gt;&gt;

    例如Integer 实现 Comparable&lt;Integer&gt;,与 Comparable&lt;? super Number&gt; 不兼容(整数不是 Number 的超类)。 Comparable&lt;? extends Number&gt; 也不起作用,因为 Java 会认为 ? 可以是 Number 的任何子类,然后将 T 传递给 compareTo 将无法编译,因为它需要 ? 的参数,而不是T.

    编辑: 正如 newacct 所说,&lt;T extends Number &amp; Comparable&lt;? super T&gt;&gt; 也可以工作(并且更通用),此后compareTo 将接受任何? 其中T 是一个子类,和往常一样,可以将子类的实例作为参数提供给需要超类的地方。

    【讨论】:

    • 非常感谢,它有效 :) 也感谢您的解释!
    • 为获得最佳效果,请使用&lt;T extends Number &amp; Comparable&lt;? super T&gt;&gt;
    猜你喜欢
    • 2012-08-30
    • 2011-10-05
    • 1970-01-01
    • 2011-05-19
    • 2010-12-20
    • 1970-01-01
    • 2017-11-10
    • 2018-06-18
    • 2013-07-24
    相关资源
    最近更新 更多