簡體   English   中英

具有泛型類型的番石榴函數

[英]Guava Function with generic types

我正在嘗試編寫一些我將在其余代碼中經常使用的Function 其中一些是比如說,總結一個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方法,但是我不明白為什么同樣的東西在這里不起作用。 我錯過了一些非常明顯的東西,還是番石榴功能不允許使用仿制葯?

幾件事:

  1. 如果要定義泛型類型的邊界(例如T extends Number ),則必須在聲明類型的地方執行此操作(例如,不是<T> Function...但是<T extends Number> Function... )。 我看到路易斯已經涵蓋了這個。
  2. 我不確定它是否真的可以實現一個可以對任何類型的Number求和的函數,盡管你可以合理地接近我的想法。 您必須考慮大於任何內置基元類型可以表示的數字的可能性( BigIntegerBigDecimal ,甚至可能是自定義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
  }
}

你不能像這樣定義一個多態變量 ,你也只能在T類型變量的初始聲明中放入像extends Number這樣的邊界。 我懷疑與你的意思最接近的東西實際上是有用的

<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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM