有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何用Java编写支持比较和算术运算的泛型方法

我想用java编写一个通用方法,如下所示:

public <T extends Number & Comparable<T>> void test(T[] a){
    T b=a[0];
    if(a[0]>0){
        a[0]*=a[0];
        b+=a[1];
    }
}

然后,我可以为该方法提供Integer[]Double[]或其他Number子类型。但我在上面尝试的代码给了我错误

请帮帮我。谢谢


共 (3) 个答案

  1. # 1 楼答案

    你有Comparable,所以如果我们有一个zeroa[0]>0可以被a[0].compareTo(zero) > 0取代(不,我想是< 0,我永远记不起来)。但是现在我们已经用完了Double之类的有用的东西

    如果Double和朋友不java.lang.Comparable,我们可以提供我们自己的java.util.Comparator。也就是说,我们将比较的实现置于数据对象之外。我们也可以做加法和乘法

    public interface Testor<T> { // Choose a better name...
        boolean isStriclyPositive(T value);
        T add(T lhs, T rhs);
        T square(T value);
    }
    
    static final Testor<Integer> INTEGER_TESTOR = new Testor<>() { // Java SE 7 diamond.
        public boolean isStriclyPositive(Integer value) { return value > 0; }
        public Integer add(Integer lhs, Integer rhs) { return lhs + rhs; }
        public Integer square(Integer value) { return value*value; }
    }
    // ... same for Double, etc.; can't use an enum :( ...
    
    test(new Integer[] { 42, 1972, 86 }, INTEGER_TESTOR);
    
    public <T> void test(T[] a, Testor<T> testor) {
        T b = a[0];
        if (testor.isStrictlyPositive(a[0])) {
            a[0] = testor.square(a[0]);
            b = testor.add(b, a[1]);
        }
    }
    

    注意,对于Short这样的事情,将其中两个相加将得到一个int

    (通常的堆栈溢出免责声明:与其说是尝试编译代码,不如说是尝试编译代码。)

  2. # 2 楼答案

    在Java中不能用泛型实现这一点。这是C++的一个好处。p>

    在某种程度上,您可以将其定义为“奇怪”,因为在Java的原始包装器上使用操作符是可能的。但这是因为不能在java.lang.Number上使用运算符,这是基本包装器的超类

    一些资源:

  3. # 3 楼答案

    除原语外的所有类型(包括推断的泛型类型)都是不支持算术运算的对象(包装器类使用装箱/拆箱来获得已知的psuedo行为)

    类型擦除使编译后的代码使用强制转换来获得正确的行为(即,在运行时,JVM不知道传递了什么类型,需要知道哪些类型才能获得正确的装箱/取消装箱行为)

    唯一(真正的)解决方案是为您想要支持的所有原语提供实现