2015-08-27 42 views
1

我有一個實現接口方法的方法。它看起來像這樣:如何在方法中使用類類型泛型

@Override 
public Double calculate(Class<Float> score) { 

    if (score == null) { 
     return null; 
    } 

    Double beta0 = new Double(-7.7631); 
    Double beta1 = new Double(0.0737); 
    Double beta2 = new Double(0.9971); 

    Log log = new Log(); 
    Exp exp = new Exp(); 

    Double logit = beta0 + (beta1 * score) + (beta2 * log.value(new Double(score + 1))); 
    Double rod = exp.value(logit)/(1 + exp.value(logit)); 

    return rod; 
} 

接口

public interface Calculator<T,S> { 
    public T calculate(Class<S> params); 
} 

我得到一個編譯錯誤the operator '*' is not defined for the argument type(s) Double, Class<Float>

我想我預計這個,但不知道如何解決它。道歉,如果這是一個簡單的問題.....

+0

你也許應該在'Class ' –

+0

上閱讀一下。你也不清楚爲什麼你要使用類。你的代碼沒有使用'Double'而不是'double'的優點,並且使用'new Double(...)'將它帶到最大值。 – Holger

+0

我試圖使用泛型,以便計算器的某些實現可以採用其他類型 – skyman

回答

2

你可能不希望Class<Float>,但只是一個Float作爲您的方法參數。

數學運算符不適用於Class類型,該類型用於定義實際類(例如用於反射)。

另外,小心操作double s,float s及其包裝:精度可能會丟失,產生意想不到的結果。

我建議至少在內部使用BigDecimal

注意

看來你@Override荷蘭國際集團的方法,這可能意味着有一流的設計一個更大的問題。 我建議檢查父類,並推斷爲什麼calculate方法將Class作爲參數。

編輯

我想你的接口方法更改爲:

public T calculate(S param); 

您還可以考慮結合您的泛型類型向上延伸Number

在東西線:

public interface Calculator<T extends Number, S extends Number> { 
    public T calculate(S param); 
} 

...和一個匿名例子執行:

Calculator<Double, Float> calc = new Calculator<Double, Float>() { 
    public Double calculate(Float param) { 
     // TODO logic 
     return null; 
    }; 
}; 
+0

好的 - 我已經包含了界面。我有一堆不同的計算器,它們採用不同的論點,但具有相同的基本結構。有沒有一種「更好」的方式來構造這個? – skyman

+0

@skyman看我的編輯。 – Mena

+0

這真的很有幫助。最初的想法是我還想將更復雜的參數列表(例如ArrayLists或beans)傳遞給某些計算器。我真的很喜歡擴展Number的概念,也許你的第一個建議(S param)更適合我的應用 – skyman

0

不能使用

Double logit = beta0 + (**beta1 * score**) + (beta2 * log.value(new Double(score + 1))); 

因爲operatator 「*」沒有爲它定義......你不能乘以這兩種不同的類型。你可以使用float來代替。

+1

這就是問題所在 –

+0

如果將泛型類型更改爲Double,我會得到類似的錯誤? – skyman

0

您必須從Double類中獲得double值。像:

Double beta0 = new Double(0.07); 
double x = beta0.doubleValue(); 

或在您的所有代碼中使用double原始數據類型。

乾杯!

+2

十多年前,這是真的...... – Holger

+0

然後,我需要重新學習一些東西...... – davidkaste

相關問題