2014-02-26 37 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问题。