2014-02-26 36 views
1

我想代碼了幾個Function s,我會在其餘的代碼中經常使用。其中一些就像是總結了Iterable的所有數字。我不希望爲DoubleInteger等實現不同的功能。只要每個元素都是數字,我想要一個函數來總結給定的Iterable 的所有元素。爲了做到這一點,我嘗試了以下內容:番石榴函數與通用類型

<T> Function<List<T extends Number>, T> sum = new Function<List<T extends Number>, T>() { 
    public T apply(List<T> tlist) { 
     // the main code 
    } 
}; 

但是我收到一個編譯器錯誤,說「意外的標記」。我以前用泛型編寫了自己的Java方法,但我不明白爲什麼同樣的東西在這裏不起作用。我是否錯過了一些可笑的顯而易見的東西,還是番石榴函數不允許泛型?

+0

在'適用()'方法返回'Double'是一個打字錯誤,改正它。 –

回答

2

有兩件事情:

  1. 如果你要定義泛型類型(例如T extends Number),你必須這樣做,其中的類型聲明(例如,未<T> Function...<T extends Number> Function...)邊界。我看到路易斯已經覆蓋了這一點。
  2. 我不確定真的有可能實現一個單一的函數,可以總結任何類型的Number,儘管你可以相當接近我想。您必須考慮到比任何內置基元類型都大的數字可能表示(BigInteger,BigDecimal,甚至可能是自定義Number的子類)。
  3. 如果你的函數返回Double,你的方法根本不需要類型參數。

它可以只是:

Function<List<? extends Number>, Double> sum = new Function<List<? extends Number, Double>() { 
    public Double apply(List<? extends Number> numbers) { 
    // the main code 
    } 
} 
+0

感謝您指出* large *數字類。根本沒有想到這些。 –

+1

只是想分享我爲Double,Integer等編寫了不同的函數。任何延伸'Number'的單一方法都會導致醜陋的'instanceof'語句列表......並且會破壞整個目的我試圖達到的目標:在我的代碼中簡潔。 –

1

你不能定義一個多態變量這個樣子,你也只能把邊界像extends NumberT型變量的初始聲明中。我懷疑是最接近你的意思是實際上的工作是一樣的東西

<T extends Number> Function<List<T>, T> sum() { 
    return new Function<List<T>, T>() { 
    public Double apply(List<T> doubles) { 
     // the main code 
    } 
    }; 
} 

...只是你也將不得不返回Double而不是T問題。