2012-03-12 4 views
0

問題があります。これらのクラスでは :Javaのジェネリックで関数のオーバーロードが発生する

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"))) 
+6

コードを凝縮して問題を実証するために必要な**最小限**にして、質問に直接貼り付けてください。 –

+0

パズルの最も重要な部分である変数「a」と「b」の宣言は表示されていません。 'GBVariable = new GBFloat(...)'の場合、動作は期待どおりです。 –

答えて

1

あなたは私が推測するつもりだabの宣言を示していないので、あなたが、その場合にはあなたが記述の行動が正しい

GBVariable<?> a = new GBFloat(...); 
GBVariable<?> b = new GBFloat(...); 

持っています。関数のディスパッチ(メソッドへの呼び出しのバインド)は、コンパイル時に引数の静的型を使用して行われます。ランタイムタイプではありません。

0

方法は、実行時、時間をコンパイルしないで行われます。このため、変数を直接キャストするときに異なる結果が得られます。

関連する問題