Unknown Region

プログラムでハマったエラーとその解決方法についての備忘録メモ

【Java】[java.util.Optional]における匿名クラスの扱いに気をつけよう

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());
  }
}

例: Test1.javaコンパイルエラー

# 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());
  }
}

 

連絡先: plugout777★yahoo.co.jp (クローラー対策のため★を@に変更してください)