具有泛型类型的番石榴函数

时间:2014-02-26 22:30:07

标签: java generics guava

我正在尝试编写一些我将在其余代码中经常使用的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方法,但是我不明白为什么同样的东西在这里不起作用。我错过了一些非常明显的东西,还是番石榴函数不允许使用泛型?

2 个答案:

答案 0 :(得分:2)

一些事情:

  1. 如果要定义泛型类型的边界(例如T extends Number),则必须在声明类型的地方执行此操作(例如,不是<T> Function...而是<T extends Number> Function...)。我看到路易斯已经涵盖了这一点。
  2. 我不确定是否真的可以实现一个可以对任何类型的Number求和的函数,尽管你可以合理地接近我的想法。您必须考虑大于任何内置基元类型的数字可能表示的数字(BigIntegerBigDecimal,甚至可能是自定义Number子类的可能性。
  3. 如果您的函数返回Double,您的方法根本不需要类型参数。
  4. 它可以是:

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

答案 1 :(得分:1)

您不能像这样定义多态变量,并且您也只能将extends Number之类的边界放在T类型变量的初始声明中。我怀疑与你的意思最接近的实际工作是像

<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时也会遇到问题。