Tôi đã gặp một vấn đề kỳ lạ khi sử dụng Optional
cá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, Bar
cả 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>
.Bar
Mặ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.