Javaの話。
※ Java8及びJava15にて事象を確認。
以下のプログラム(Test1.java)はコンパイルエラーが発生する。
例: Test1.java
import java.util.Optional; public class Test1 { public static void main(String... args) { Object object = Optional.of(new Object(){}) .orElse(new Object()); } }
# javac Test.java Test.java:6: error: incompatible types: Object cannot be converted to <anonymous Object> .orElse(new Object()); ^
これは極端な例だが、取得するインスタンスのクラスがObjectクラスを拡張した匿名クラス、[Optional.orElse()]の引数がObjectクラスのインスタンスで、それぞれクラスが食い違っているために発生する。
これは[java.util.Optional.map()]を経た場合においても発生するので、実際にあり得そうな例としてはmap内で何かのクラス(例えばA)の匿名クラスインスタンスを生成し、[java.util.Optional.orElse()]には単純なAのインスタンスを指定した場合に発生しうると考えられる。
ただ、エラーメッセージが若干わかりにくいために遭遇すると困惑するかもしれない。
単純な解決方法としては[java.util.Optional.map()]にてキャストを挟めば良い。
例: Test2.java
import java.util.Optional; public class Test2 { public static void main(String... args) { Object object = Optional.of(new Object(){}) .map(Object.class::cast) .orElse(new Object()); } }