gpt4 book ai didi

java - 可选择在 map 和 orElseGet 中使用通用通配符

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:48:32 24 4
gpt4 key购买 nike

我准备了一个小例子来复制我的项目中发生的事情。我知道如何解决它,但我很好奇为什么它甚至无法编译。当我在方法 public TestElement<?> test() 中使用通用通配符时,问题出在最后一次返回中, 正好是 return response.map((element) -> mapAux(50L)).orElseGet(()-> orElseGetAux(20)); 行...我不知道为什么它不能编译。我究竟做错了什么?有什么线索吗?

提前致谢!

public class FullTest {
public static class TestElement<T>{
public T element;

public TestElement(T t) {
element = t;
}
}

public static <U> TestElement<U> createElement(U input) {
return new TestElement<>(input);
}

private TestElement<?> mapAux(Long element){
return new TestElement<>(element);
}

private TestElement<?> orElseGetAux(Integer element){
return new TestElement<>(element);
}

public TestElement<?> test(){
Optional<Long> response = Optional.of(5L);
return response.map((element) -> mapAux(50L)).orElseGet(()-> orElseGetAux(20));
}
}

更新 1 - 包括错误

我在 IntelliJ 的最新版本上使用 Java 8,错误是这样的:

Error:(33, 78) java: incompatible types: bad return type in lambda expression

FullTest.TestElement<capture#1 of ?> cannot be converted to FullTest.TestElement<capture#2> of ?>

更新 2 - 更进一步和解决方法

使用通配符是因为我需要返回TesElement<>不同的类,这是我找到的唯一方法(在示例 Long 和 Integer 中)。我对其他选择持开放态度...

这是我希望避免的可能的解决方法(这是一个例子,我知道 isPresent() 总是返回 true):

public TestElement<?> testWorkAround(){
Optional<Long> response = Optional.of(5L);
TestElement<?> testElement;
if(response.isPresent()){
testElement = mapAux(response.get());
}
else{
testElement = orElseGetAux(20);
}
return testElement;
}

最佳答案

你只需要明确指定它:)

public TestElement<?> test() {
return Optional.of(5L)
.<TestElement<?>>map(element -> mapAux(50L));
.orElseGet(() -> orElseGetAux(20L));
}

关于java - 可选择在 map 和 orElseGet 中使用通用通配符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47701065/

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