2017-08-18 3 views
1

私はこのコードを持っています、目標はいくつかの数字を取って、別の番号を教えてください。簡単に。GWTコンパイラ:2つの数字を追加すると文字列が作成されます

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のログ出力がある(入力値のためのコメントを参照してください):=

補間値文字列のように扱わなっている「toReturn」と言われます1から0.16666666666666666

を、それは値が等しいです"lowValue"と "increment"の連結に変換します。

これはGWTなので、ここで書いているJavaコードはJSにコンパイルされていて、ある時点で値が誤って文字列にキャストされています。これを引き起こす原因は何ですか?とにかくそれを解決するには?私はGWT v2.6を使用しています。

名前付けがlowValueとhighValueで、実際にはそれぞれ1と0であるはずです。

+1

JSから直接interpolateDoublePropertyを呼び出していますか? (つまり、GWTコンパイルされたJSとは対照的にネイティブJSからの呼び出し)。 – Andrei

+0

GWT 2.8.0ではこの動作が表示されません。 「補間値= 0.8333333333333334」となる。あなたは更新しようか?また、出力の完全なかなりのバージョンでコンパイルしてみてください、あなたはJSがどのように生産されているかを知ることができ、おそらくそのようなことが起こっているのか理解することができます。 – Stik

+0

私はinterpolateDoublePropertyをGWTコンパイル済みJSからのみ呼び出しています – user3689186

答えて

1

はそれを解決:

変数lowValueは、もともとJSNIコードで作成および管理HTMLスライダーで設定されていた分野から来た:コンパイル後

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

、何guarenteeはありませんスライダの値は実際には倍(実際には文字列として保存されました!)です。それは最終的には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() + "'"); 
関連する問題