Encontrei um problema estranho usando Optional
classes anônimas e s:
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() {
});
}
}
Os dois primeiros métodos não são compilados com o erro
java: incompatible types: <anonymous test.Foo.Bar> cannot be converted to <anonymous test.Foo.Bar>
Eu esperava isso, já que ambos implementam a interface, Bar
todas as três abordagens funcionam. Também não consigo descobrir por que a terceira opção resolve o problema. Alguém pode explicar isso, por favor?
Optional.of
é fixoOptional<Bar>
. Em todos os outros casos, éOptional<SubAnonymousSubclassOfBar>
. Eu esperava que os outros dois inferissem também o limite superior comum apropriadoBar
. Mas, aparentemente,Optional<SomeSubclassOfBar>(bar).orElse(someOtherSubclassOfBar)
precisa de alguma ajuda.