我准备了一个小例子来复制项目中发生的情况。我知道如何解决它,但是我很好奇为什么它甚至不能编译。问题是当我在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,错误是这样的:
错误:(33,78)Java:不兼容的类型:Lambda表达式中的返回类型错误
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(){
Optional<Long> response = Optional.of(5L);
Optional< TestElement<?> > opResult = response.map( (element) -> mapAux(50L) );
TestElement<?> result = opResult.orElseGet( () -> orElseGetAux(20L) );
return result;
}
关于java - 可选在map和orElseGet中使用通用通配符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47701065/