处理对java.lang.Number的子类的操作的通用通用方法
我有一个类MyGen
,它接受两个通用参数并有一个方法getValue()
public interface MyGen<E,T> {
T getValue();
}
通常第二个泛型类型是Long
or Integer
。
然后,当第二个泛型类型Long
如下时,我写了一个方法来组合对象:
public static <E extends MyGen<?, Long>> long combineValue(Set<E> set) {
return set.stream()
.map(MyGen::getValue)
.reduce(0L, (a,b) -> a | b);
}
现在我想在第二种类型是Integer
. 所以我尝试将上述相同的方法更新为:
public static <E extends MyGen<?, ? extends Number>> long combineValue(Set<E> set) {
return (long) set.stream()
.map(MyGen::getValue)
.reduce((a,b) -> a | b) // error1
.orElse(0); // error2
}
但显示以下错误:
- 错误1
运营商 | 未定义参数类型 capture#4-of ?扩展 java.lang.Number, capture#4-of ? 扩展 java.lang.Number
- 错误2
Optional<capture#4-of 类型中的方法 orElse(capture#4-of ? extends Number) extends Number> 不适用于参数 (int)
有没有办法用相同的方法来处理这两种情况Long
,Integer
或者只能使用两种不同的方法来完成?
回答
您似乎对这个常用方法的返回值是long
. 在这种情况下,这是可能的,因为您可以long
从Number
using获取 a longValue
:
public static long combineValue(Set<? extends MyGen<?, ? extends Number>> set) {
return set.stream()
.map(MyGen::getValue)
.mapToLong(Number::longValue)
.reduce(0L, (a,b) -> a | b);
}
你基本上long
是先把每个数字都变成s,然后再做归约。
- Could also be mapped with a single `.mapToLong(g -> g.getValue().longValue())`. Or everything at once: `set.stream().reduce(0L, (l, g) -> l | g.getValue().longValue(), (a,b) -> a | b)`