我正在尝试编写一些 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 方法,但我不明白为什么同样的事情在这里不起作用。我是不是漏掉了一些非常明显的东西,还是 guava 函数不允许泛型?
最佳答案
几件事:
- 如果您要为通用类型定义边界(例如
T extends Number
),您必须在声明类型的地方进行定义(例如不是<T> Function...
而是<T extends Number> Function...
)。我看到 Louis 已经讲过了。 - 我不确定是否真的有可能实现一个可以对任何类型的
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
}
}
关于java - 具有泛型类型的 Guava 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22054873/