GWT编译器:添加两个数字正在创建一个字符串

时间:2017-08-18 15:07:56

标签: javascript java gwt

我有这个代码,目标是,拿一些数字,并给我另一个数字。很容易。

private final int height = 5;

private double interpolateDoubleProperty(
    int heightAtLower, int heightAtHigher,      //4, 10
    double lowValue, double highValue)          //1, 0
{        
    double lowToHighDelta = heightAtHigher - heightAtLower;          // 6 = 10 - 4        
    double lowToThisDelta = (double)this.height    - heightAtLower;  // 1 = 5 - 4        
    double lerpRatio = lowToThisDelta / lowToHighDelta;              // 0.17  = 1 / 6        
    double valueDelta = highValue - lowValue;                        // -1 = 0 - 1
    double increment = lerpRatio * valueDelta;                       // -0.17 = 0.17 * -1
    double toReturn = lowValue + increment;                          // 0.83 = 1 + -0.17

    GWT.log("interpolated value = " + toReturn);

    return toReturn;
}

但是,我得到的返回值很糟糕。对于这种情况(请参阅输入值的注释),GWT日志输出为:

插值= 1-0.16666666666666666

它告诉我" toReturn"正在被视为一个字符串,它的值等于" lowValue"的串联。和"增加"。

这是GWT,所以无论我在这里编写的Java代码是否都被编译成JS,并且在某些时候,该值被错误地转换为字符串。可能是什么导致了这个?无论如何要解决它?我正在使用GWT v2.6。

承担命名,lowValue和highValue,实际上分别为1和0。

1 个答案:

答案 0 :(得分:2)

解决了它:

变量 lowValue 最初来自一个由JSNI代码创建和管理的HTML滑块设置的字段:

private static native double getSliderValue(String sliderID) /*-{
    return $doc.getElementById(sliderID).value;       
}-*/;

编译之后,没有保证滑块的值实际上是双倍的(它实际上是保存为字符串!)。它最终进入了 interpolateDoubleProperty 输入参数并打破了它添加到的任何变量。

要解决这个问题,我们只需要"消毒"将值字段乘以 1.0

private static native double getSliderValue(String sliderID) /*-{
    return $doc.getElementById(sliderID).value * 1.0;
}-*/;

此代码帮助我在编译后跟踪变量实际上在运行时的类型,最终将我引回滑块。

GWT.log("Value: '" + variableToTest + "' is actually type: '" + ((Object)variableToTest).getClass().getName() + "'");