2012-03-12 58 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."); 
} 

當我執行的PLUSTOKEN eval方法,而當a和b型GBFloat的Java仍然選擇了sum(GBVariable<?> a, GBVariable<?> b)方法並拋出異常:

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

請將您的代碼精簡至**所需的最低**數量,以便將問題直接粘貼到您的問題中。 – 2012-03-12 17:09:44

+0

你還沒有顯示變量'a'和'b'的聲明,這是謎題中最關鍵的部分。如果它是'GBVariable a = new GBFloat(...)',那麼行爲就像預期的那樣。 – 2012-03-12 17:14:59

回答

1

既然你並沒有顯示出ab我要去猜測的聲明,你有

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

在這種情況下,您所描述的行爲是正確的。函數調度(綁定對方法的調用)發生在編譯時,使用參數的靜態類型。不是運行時類型。

0

方法進行編譯的時候,不是運行。這就是爲什麼直接投射變量時會得到不同的結果。