私は、プロジェクトで起こったことを複製するための少しの例を用意します。私はそれを回避する方法を知っていますが、なぜそれがコンパイルされないのかは非常に不思議です。問題は最終的に返されます。私がメソッドpublic TestElement<?> test()
の一般的なワイルドカードを使用しているときは、正確にはreturn response.map((element) -> mapAux(50L)).orElseGet(()-> orElseGetAux(20));
という行です...なぜコンパイルされないのでしょうか?私は間違って何をしていますか?どんな手掛かり?mapとorElseGetで一般的なワイルドカードを使用するオプション
ありがとうございます!
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 ?>
アップデート: -
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));
}
}
Update 1では、エラー
私はのIntelliJの最後のバージョン上で、Javaの8を使用していますし、エラーがこれですインクルード2 - もう少しと回避策
ワイルドカードを使用するのは、異なるクラスのTesElement<>
を返す必要があるからです(これは、LongとIntegerの例では唯一の方法です)。私はここで
私は避ける好む可能な回避策
(これは一例ですが、私は常にtrueを返しisPresent()
を知っている)...他のオプションを開いています:
public TestElement<?> testWorkAround(){
Optional<Long> response = Optional.of(5L);
TestElement<?> testElement;
if(response.isPresent()){
testElement = mapAux(response.get());
}
else{
testElement = orElseGetAux(20);
}
return testElement;
}
@rgettmanフィードバックをいただきありがとうございます。私は、コンパイラのエラーメッセージを含める。 – JTejedor