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