【发布时间】:2019-12-03 13:53:34
【问题描述】:
我在使用Optionals 和匿名类时遇到了一个奇怪的问题:
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() {
});
}
}
前两种方法无法编译并报错
java: incompatible types: <anonymous test.Foo.Bar> cannot be converted to <anonymous test.Foo.Bar>
我预料到了,因为两者都实现了接口Bar,所有三种方法都可以工作。我也无法弄清楚为什么第三个选项可以解决问题。谁能解释一下?
【问题讨论】:
-
第三个解决了这个问题,因为
Optional.of的类型固定为Optional<Bar>。在所有其他情况下,它是Optional<SubAnonymousSubclassOfBar>。不过,我本来希望其他两个也能对Bar的适当公共上限进行类型推断。但显然Optional<SomeSubclassOfBar>(bar).orElse(someOtherSubclassOfBar)需要一些帮助。
标签: java optional anonymous-class