私はOptional
と匿名クラスを使用して奇妙な問題に遭遇しました:
public class Foo {
interface Bar {
}
void doesNotCompile() {
Optional.of(new Bar() {
}).orElse(new Bar() {
});
}
void doesNotCompile2() {
final Bar bar = new Bar() {
};
Optional.of(new Bar() {
}).orElse(bar);
}
void compiles1() {
final Bar bar = new Bar() {
};
Optional.of(bar).orElse(new Bar() {
});
}
}
最初の2つのメソッドはエラーでコンパイルされません
java: incompatible types: <anonymous test.Foo.Bar> cannot be converted to <anonymous test.Foo.Bar>
どちらもインターフェースを実装しているため、Bar
3つのアプローチすべてが機能することを期待していました。3番目のオプションで問題が修正される理由もわかりません。誰かがこれを説明できますか?
Optional.of
がに固定されてOptional<Bar>
いるため、3つ目は問題を修正します。他のすべてのケースでは、それはOptional<SubAnonymousSubclassOfBar>
です。しかし、他の2つも適切な共通の上限を型推論すると期待してBar
いました。しかし、どうやらOptional<SomeSubclassOfBar>(bar).orElse(someOtherSubclassOfBar)
いくつかの手持ちが必要です。