我正在尝试编写一些我将在其余代码中经常使用的Function
代码。其中一些是总结Iterable
的所有数字的事情。而不是为Double
,Integer
等实现不同的函数。我想要一个函数来总结给定的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 :(得分:2)
一些事情:
T extends Number
),则必须在声明类型的地方执行此操作(例如,不是<T> Function...
而是<T extends Number> Function...
)。我看到路易斯已经涵盖了这一点。Number
求和的函数,尽管你可以合理地接近我的想法。您必须考虑大于任何内置基元类型的数字可能表示的数字(BigInteger
,BigDecimal
,甚至可能是自定义Number
子类的可能性。 Double
,您的方法根本不需要类型参数。它可以是:
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
时也会遇到问题。