Tôi đã gặp một vấn đề kỳ lạ khi sử dụng Optionalcác lớp s và ẩn danh:
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() {
});
}
}
Hai phương thức đầu tiên không biên dịch với lỗi
java: incompatible types: <anonymous test.Foo.Bar> cannot be converted to <anonymous test.Foo.Bar>
Tôi mong đợi rằng, vì cả hai đều thực hiện giao diện, Barcả ba cách tiếp cận đều hoạt động. Tôi cũng không thể tìm ra lý do tại sao tùy chọn thứ ba khắc phục vấn đề. Bất cứ ai có thể giải thích điều này xin vui lòng?
Optional.ofđược sửaOptional<Bar>. Trong tất cả các trường hợp khác, nó làOptional<SubAnonymousSubclassOfBar>.BarMặc dù vậy, tôi cũng mong hai người kia sẽ suy ra giới hạn chung thích hợp là tốt. Nhưng rõ ràngOptional<SomeSubclassOfBar>(bar).orElse(someOtherSubclassOfBar)cần một số cầm tay.