Encontré un problema extraño usando Optional
sy clases anónimas:
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() {
});
}
}
Los dos primeros métodos no se compilan con el error
java: incompatible types: <anonymous test.Foo.Bar> cannot be converted to <anonymous test.Foo.Bar>
Lo esperaba, ya que ambos implementan la interfaz, Bar
los tres enfoques funcionan. Tampoco puedo entender por qué la tercera opción soluciona el problema. ¿Alguien puede explicar esto por favor?
Optional.of
se fija el tipo deOptional<Bar>
. En todos los demás casos, lo esOptional<SubAnonymousSubclassOfBar>
. Sin embargo, también hubiera esperado que los otros dos dedujeran el límite superior común apropiadoBar
. Pero aparentementeOptional<SomeSubclassOfBar>(bar).orElse(someOtherSubclassOfBar)
necesita algo de mano.