Java减去通用值运算符减去是未定义的

时间:2014-11-05 10:00:11

标签: java generics

我试图从提供的数组(2D数组)中减去该值。我想通过使用泛型来做。任何人都可以帮助我的代码出错。我的意思是我需要扩展一些课吗?我收到错误(运算符 - 未定义参数类型T,T)

提前致谢。

//this method Subtracts Value from the given Matrix for all the rows but for given columns 
private <T> void subtractValueFromColumns(T[][] matrix,
        ArrayList<Integer> columnsIndex, T value) {

    for(int i = 0; i < matrix.length; i++){
        for(int j = 0; j < columnsIndex.size(); j++){
            matrix[i][j] = matrix[i][j] - value;
        }
    }

}

3 个答案:

答案 0 :(得分:1)

您需要定义可在该给定类型上使用的操作和方法。

public interface ArithmeticOps<T extends ArithmeticOps<T>>
{
    T add(T other);
    T subtract(T other);
    T divide(T other);
    T multiply(T other);
}

private <T extends ArithmeticOps<T>> void subtractValueFromColumns(T[][] matrix,
        List<Integer> columnsIndex, T value) {
    for(int i = 0; i < matrix.length; i++){
        for(int j = 0; j < columnsIndex.size(); j++){
            matrix[i][j] = matrix[i][j].subtract(value);
        }
    }
}

它与LibGDX的Vector操作类似。

https://github.com/libgdx/libgdx/blob/master/gdx/src/com/badlogic/gdx/math/Vector.java

 public interface Vector<T extends Vector<T>> {
    /** Scales this vector by a scalar
     * @param scalar The scalar
     * @return This vector for chaining */
    T scl (float scalar);

    T add (T v);
}

https://github.com/libgdx/libgdx/blob/master/gdx/src/com/badlogic/gdx/math/Vector2.java

public class Vector2 implements Serializable, Vector<Vector2> {
    @Override
    public Vector2 scl (float x, float y) {
        this.x *= x;
        this.y *= y;
        return this;
    }

    @Override
    public Vector2 add (Vector2 v) {
        x += v.x;
        y += v.y;
        return this;
    }
}

答案 1 :(得分:1)

如果没有强制转换你就无法做到(这或多或少意味着Generics在这里毫无用处)。

-运算符只能应用于数值类型,但在编译时,编译器无法识别泛型类型T的运行时类型。


作为一种解决方法,我可以建议使用BigDecimal类型及其嵌套算术方法(如.subtract()

private void subtractValueFromColumns(BigDecimal[][] matrix,
        ArrayList<Integer> columnsIndex, BigDecimal value) {
    for(int i = 0; i < matrix.length; i++){
        for(int j = 0; j < columnsIndex.size(); j++){
            matrix[i][j] = matrix[i][j].subtract(value);
        }
    }
}

但这会产生不利影响。为了正确使用该方法,您将被迫将数字变量转换为BigDecimal,反之亦然

答案 2 :(得分:1)

-仅定义为int等几种类型,以及Integer可转换/取消装箱的类型。减法不适用于泛型类型,因为Java无法知道类型T是否可以转换为例如intT。 Java也没有运算符重载,这意味着您无法在以后为任意类型定义该运算符的含义。

但是,您可以将minus(T other)限制为具有Number方法的内容并使用该方法。您也可以使用T代替.doubleValue(),并使用interface Operation<T> { T apply(T one, T two); } private <T> void subtractValueFromColumns(T[][] matrix, ArrayList<Integer> columnsIndex, T value, Operation<T> op) { for(int i = 0; i < matrix.length; i++){ for(int j = 0; j < columnsIndex.size(); j++){ matrix[i][j] = op.apply(matrix[i][j], value); } } } 进行数学运算。

另一种可能性是让这个方法的客户定义操作如何工作:

{{1}}