首页 > 解决方案 > 如何从类中获取二元运算符?

问题描述

有没有办法获得与类相关的二元运算符?我有这个有两个参数的方法:

    public <T extends Number> T[] sumArray(T[] arrayToAdd, BinaryOperator<T> add){
        T[] arrayToReturn =  arrayToAdd.clone();
        for (int i = 0; i < arrayToAdd.length; i++) {
            arrayToReturn[i] = arrayToAdd[i];
            for (int j = 0; j < i; j++) {
                arrayToReturn[i] = add.apply(arrayToReturn[i], arrayToAdd[j]);
            }
        }
        return arrayToReturn;
    }

但是,我想做这样的事情:

    public <T extends Number> T[] sumArray(T[] arrayToAdd){
        BinaryOperator add = arrayToAdd.getClass().getBinaryOperator(sum);
        T[] arrayToReturn =  arrayToAdd.clone();
        for (int i = 0; i < arrayToAdd.length; i++) {
            arrayToReturn[i] = arrayToAdd[i];
            for (int j = 0; j < i; j++) {
                arrayToReturn[i] = add.apply(arrayToReturn[i], arrayToAdd[j]);
            }
        }
        return arrayToReturn;
    }

PD:从另一个类调用第一种方法时,我也遇到了问题: api.sumArray(intArray, Integer::sum); 错误说:'Object is not convertible to int'

- - - - - - - - - 编辑 - - - - - - - - -

最小可重现示例

public class guide6Main<T extends Comparable<T>, N extends Number> {
    public static void main(String[] args) {
        ApiArray api = new ApiArray();
        Integer[] intArray = {1, 2, 3, 4};
        api.exercise6(intArray, Integer::sum);
     }
}
public class ApiArray<T extends Comparable<T>, N extends Number> {
    public  <N extends Number> N[] exercise6(N[] arrayToAdd, BinaryOperator<N> add){
        N[] arrayToReturn =  arrayToAdd.clone();
        for (int i = 0; i < arrayToAdd.length; i++) {
            arrayToReturn[i] = arrayToAdd[i];
            for (int j = 0; j < i; j++) {
                arrayToReturn[i] =add.apply(arrayToReturn[i],arrayToAdd[j] );
            }
        }
        return arrayToReturn;
    }
}

这是错误:

D:\Documentos\Austral\Álgerba III\src\Guia6\Team2Solution\guide6Main.java:11:49
java: incompatible types: invalid method reference
    incompatible types: java.lang.Object cannot be converted to int

PD2:另外,arrayToAdd不能包含类型的混合,我的意思是,它可以,但在这种情况下不是(最小的可重现示例可以吗?我从来没有做过这样的事情)

标签: javasumbinary-operators

解决方案


纯粹回答错误“ incompatible types: java.lang.Object cannot be converted to int”:

public class guide6Main<T extends Comparable<T>, N extends Number> {
    public static void main(String[] args) {
        ApiArray api = new ApiArray();
        Integer[] intArray = {1, 2, 3, 4};
        api.exercise6(intArray, Integer::sum);
     }
}

public class ApiArray<T extends Comparable<T>, N extends Number> {
    public  <N extends Number> N[] exercise6(N[] arrayToAdd, BinaryOperator<N> add){
        // ...
    }
}

ApiArray是泛型类型,但是ApiArray api是原始类型变量(它没有类型参数)。

原始类型会擦除所有泛型,甚至那些与省略的类型参数无关的泛型。

api使用通配符类型声明:

    ApiArray<?, ?> api = new ApiArray<>();

(或者,很明显,在那里放入非通配符类型,如果有可以有用地添加的类型)。

如果它们不是必需的,请从类中删除类型参数。


推荐阅读