Java 爪哇语:;机具操作员?“;

Java 爪哇语:;机具操作员?“;,java,generics,operators,Java,Generics,Operators,我有一些包含很多计算内容的函数。所有计算均使用运算符[]、*、/、+和-。其他的事情就是循环和测试。因此,这些相同的函数“可以”用于实现这些运算符的任何类型,例如double、float、int、long等。出于性能原因,我只使用基本类型。有没有办法做到这一点 另外,出于性能原因,我不想将浮点和整数转换为double,而将计算转换为double。我想计算整数对整数,浮点对浮点,双精度对双精度。我只是不想写三次相同的代码,只是不同的类型使用 例如,我猜你有 public double doSome

我有一些包含很多计算内容的函数。所有计算均使用运算符[]、*、/、+和-。其他的事情就是循环和测试。因此,这些相同的函数“可以”用于实现这些运算符的任何类型,例如double、float、int、long等。出于性能原因,我只使用基本类型。有没有办法做到这一点

另外,出于性能原因,我不想将浮点和整数转换为double,而将计算转换为double。我想计算整数对整数,浮点对浮点,双精度对双精度。我只是不想写三次相同的代码,只是不同的类型使用

例如,我猜你有

public double doSomething(double a, double b)
{
    return a * b + 1;
}
当然,实际的fn做的远不止这些

我想一个把戏应该是这样的

public T doSomething(T a, T b)
{
    return staticAdd(staticMul(a,b),1);
}

…并将所有使用的类型的基本操作定义为静态fn。但由于这些不是内联的,这将添加另一个fn调用

java中有没有一种方法可以做这样的事情
..?

Java支持的唯一运算符重载是
+
作为stringify和concatenate。如果您想要这个,您需要一种非Java JVM语言


但是,回想一下老笑话:“如果你想要LISP,你知道在哪里可以找到它。”

简单地说,这是不可能的。Java是静态类型的,不能从底层类型抽象操作


例如,您不能在数字上定义算术运算以抽象出底层类型(Short、Integer等)。

您给出的定义方法(如
staticAdd
)的建议并不像您一开始想象的那么糟糕。HotSpot将为你做的一件事(当它有心情时)是。如果您为所关心的类型定义这样的函数,您可能会获得良好的性能

也就是说,您仍然需要处理自动装箱,因为您不能在原语上泛化方法。如果性能确实如此关键,那么您可能无法编写多个方法签名。
但是,我们可以认为,在将来的java/jvm版本中,基元可能会出现。当然,处理包装类型的代价不是零,但在许多应用程序中几乎可以忽略不计。

简短回答,没有办法做到这一点。类型系统不够强大,无法在Java中表达此类内容

此外,由于泛型中不支持基本数据类型,您可能必须使用包装类,如
整数
浮点
等,使用包装类最常见的方法如下:

public class Calculator<T extends Number> {
    T add(T a, T b) {
        if (a instanceof Double) {
            return (T) Double.valueOf((a.doubleValue() + b.doubleValue()));
        } else if (a instanceof Float) {
            return (T) Float.valueOf(((a.floatValue() + b.floatValue())));
        } else if (a instanceof Integer) {
            return (T) Integer.valueOf(((a.intValue() + b.intValue())));
        }
        throw new IllegalArgumentException();
    }
}
公共类计算器{
T添加(T a,T b){
if(双精度的实例){
返回(T)Double.valueOf((a.doubleValue()+b.doubleValue());
}else if(浮点实例){
返回(T)Float.valueOf(((a.floatValue()+b.floatValue()));
}else if(整数的实例){
返回(T)Integer.valueOf(((a.intValue()+b.intValue()));
}
抛出新的IllegalArgumentException();
}
}
您可以调用与下面相同的函数

Calculator<Double> c1 = new Calculator<Double>();
mc.add(1.0, 1.1);

Calculator<Integer> c1 = new Calculator<Integer>();
mc.add(1, 2);
Calculator c1=新计算器();
mc.add(1.0,1.1);
计算器c1=新计算器();
mc.添加(1,2);

Java不支持运算符重载。在Java中无法做到这一点。@Qurliom:这不是问题所在。“但由于这些都没有内联,这将添加另一个fn调用。”如果调用足够多,JVM将内联它们。