gpt4 book ai didi

java - 处理 java.lang.Number 子类操作的通用泛型方法

转载 作者:行者123 更新时间:2023-12-02 16:16:29 25 4
gpt4 key购买 nike

我有一个 MyGen 类,它接受两个通用参数并有一个方法 getValue()

public interface MyGen<E,T> {

T getValue();
}

通常第二个泛型类型是 LongInteger

然后,我写了一个方法来在第二个泛型类型是 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. 错误1

The operator | is undefined for the argument type(s) capture#4-of ?extends java.lang.Number, capture#4-of ? extends java.lang.Number

  1. 错误2

The method orElse(capture#4-of ? extends Number) in the typeOptional<capture#4-of ? extends Number> is not applicable for thearguments (int)

有什么方法可以在同一个方法中同时处理 LongInteger 还是只能使用两种不同的方法来完成?

最佳答案

您似乎不介意这个通用方法的返回值是 long。在这种情况下,这是可能的,因为您可以使用 longValueNumber 中获取 long:

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,然后再做归约。

关于java - 处理 java.lang.Number 子类操作的通用泛型方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66542190/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com