Java 泛型 : Comparing an Integer to a Double

标签 java generics comparable

谁能帮我用泛型比较 Integer 和 Double?

这是我的:

public static <T extends Comparable<? super T>> int compare(T arg1, T arg2)
{
    return arg1.compareTo(arg2);
}

public static void main(String[] args)
{   
    Number i = new Integer(5);
    Number j = new Double(7);

    System.out.println(GenericsTest.compare(i, j));
}

我得到的错误信息是: 绑定(bind)不匹配:GenericsTest 类型的通用方法 compare(T, T) 不适用于参数 (Number, Number)。推断类型 Number 不是有界参数的有效替代 >

最佳答案

此解决方案的想法是扩大到 BigDecimal,然后比较两个数字(现在更清晰,但不知何故格式化不起作用)。请注意,您可以重复使用此静态比较器,而不必在其他任何地方强制转换为 double 。在实现中,您确实需要转换为 double 以不丢失信息,基本上您扩大到最一般的表示形式。

private static final Comparator<Number> NUMBER_COMPARATOR = new Comparator<Number>() {
    private BigDecimal createBigDecimal(Number value) {
        BigDecimal result = null;
        if (value instanceof Short) {
            result = BigDecimal.valueOf(value.shortValue());
        } else 
        if (value instanceof Long) {
            result = BigDecimal.valueOf(value.longValue());             
        } else 
        if (value instanceof Float) {
            result = BigDecimal.valueOf(value.floatValue());                                
        } else 
        if (value instanceof Double) {
            result = BigDecimal.valueOf(value.doubleValue());                               
        } else 
        if (value instanceof Integer) {
            result = BigDecimal.valueOf(value.intValue());                              
        } else {
            throw new IllegalArgumentException("unsupported Number subtype: " + value.getClass().getName());
        }
                       assert(result != null);

        return result;
    }

    public int compare(Number o1, Number o2) {
        return createBigDecimal(o1).compareTo(createBigDecimal(o2));
    };
};

public static void main(String[] args) {
    Number i = Integer.valueOf(5);
    Number j = Double.valueOf(7);
              // -1
    System.out.println(NUMBER_COMPARATOR.compare(i, j));

         i = Long.MAX_VALUE;
         j = Long.valueOf(7);
              // +1
         System.out.println(NUMBER_COMPARATOR.compare(i, j));

         i = Long.MAX_VALUE;
         j = Long.valueOf(-7);
              // +1
         System.out.println(NUMBER_COMPARATOR.compare(i, j));

         i = Long.MAX_VALUE;
         j = Double.MAX_VALUE;
              // -1
         System.out.println(NUMBER_COMPARATOR.compare(i, j));

    i = Long.MAX_VALUE;
    j = Long.valueOf(Long.MAX_VALUE - 1);
    // +1
    System.out.println(NUMBER_COMPARATOR.compare(i, j));

              // sorting Long values
    Long[] values = new Long[] {Long.valueOf(10), Long.valueOf(-1), Long.valueOf(4)};
    Arrays.sort(values, NUMBER_COMPARATOR);
              // [-1, 4, 10] 
    System.out.println(Arrays.toString(values));  
}

关于Java 泛型 : Comparing an Integer to a Double,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13759844/

相关文章:

java - 为什么 System.getProperty 在 eclipse + Java 8 中不起作用?

c# - List(T).ForEach 未使用 Xamarin 定义

C# 泛型,状态模式的交叉引用类

java - 通用二分搜索 - JAVA -

java - ClientRequestFactory RestEasy 已弃用...还有其他 RestEasy 替代方案吗?

java - 如何删除前一行正则表达式?

java - 在不破坏签名的情况下将元数据添加到 Android APK

java - 泛型类对象的嵌套泛型参数没有意义

java - 对按字母顺序排列的列表中的两个值重新排序。枚举/比较器

java - 在 3 个不同的类别上使用可比较的