問題があります。これらのクラスでは :Javaのジェネリックで関数のオーバーロードが発生する
- PrimitiveToken
- GBVariable
- GBFloat:
public class GBFloat extends GBVariable<Float> {
public GBFloat(String name, Float value) { super(name, value); }
}
- PlusToken:
@Override
public GBVariable<?> eval() {
return sum(a.eval(),b.eval());
}
public static GBFloat sum(GBFloat a, GBFloat b) {
System.out.println("float added");
return new GBFloat("tmp", a.getValue()+b.getValue());
}
public static GBVariable<?> sum(GBVariable<?> a, GBVariable<?> b) {
throw new RuntimeException("Adding variables of types "+a.getClass().getSimpleName()+" and "+b.getClass().getSimpleName()+" is not supported.");
}
とbがGBFloat Javaはまだsum(GBVariable<?> a, GBVariable<?> b)
方法を選択し、例外をスローするタイプのものでありながら、一方で私はPlusTokenでevalメソッドを実行します。
Exception in thread "main" java.lang.RuntimeException: Adding variables of types GBFloat and GBFloat is not supported.
彼はより多くを選ぶべきではありません具体的な方法は?私がa.eval()とb.eval()をGBVariablesにキャストすると、まずうまく動作します。それはなぜですか、どうすればこの問題を優雅に解決できますか?
a、bはそのように宣言されていますロードオーバー
new PrimitiveToken<GBFloat>(new GBFloat("tmp",Float.parseFloat("15.0")))
コードを凝縮して問題を実証するために必要な**最小限**にして、質問に直接貼り付けてください。 –
パズルの最も重要な部分である変数「a」と「b」の宣言は表示されていません。 'GBVariable > = new GBFloat(...)'の場合、動作は期待どおりです。 –