trả lời nắm để Java does not support lower bounds on parameterized methods, because such a feature is "not useful enough"
, hãy tham khảo một similar questionTại sao trình biên dịch Java không thể suy luận đúng cách thừa kế?
Với đoạn mã sau:
package demo;
public class Demo {
interface Foo { void foo(); }
interface Bar { void bar(); }
interface FooBar {
<R extends Foo & Bar> R foobar();
static FooBar create() { return new TypicalJavaFooBar(); }
}
private static final class TypicalJavaFooBar implements Foo, Bar, FooBar {
public void bar() { System.out.println("foo"); }
public void foo() { System.out.println("bar"); }
public <R extends Foo & Bar> R foobar() {
return (R) this;
}
}
public static void main(String[] args) {
FooBar x = FooBar.create();
Foo foo = x.foobar();
Bar bar = x.foobar();
x.foobar().foo();
x.foobar().bar();
}
}
Nếu không có các diễn viên rõ ràng để R
trong TypicalJavaFooBar#foobar
trình biên dịch không thành công với các lỗi sau
Error:(13, 20) java: incompatible types: demo.Demo.TypicalJavaFooBar cannot be converted to R
My câu hỏi là tại sao? Với tôi, có vẻ như trình biên dịch phải có đủ thông tin kể từ khi TypicalJavaFooBar
được xác định rõ ràng để triển khai cả hai Foo
và Bar
; tại sao không đủ để đáp ứng ràng buộc Foo & Bar
?
CẬP NHẬT
Mục đích chính của bài tập này là để xác định các hợp đồng sau: Phương pháp foobar
kêu gọi một thể hiện của một FooBar
được đảm bảo để trở một cái gì đó mà thực hiện cả hai Foo
và Bar
.
@horatius Điều đó không liên quan gì đến câu hỏi này. – chrylis
Trong 'TypicalJavaFooBar', bạn có thể thay đổi kiểu trả về của phương thức' foobar' thành 'TypicalJavaFooBar', cũng có thể bỏ đi với dàn diễn viên. Trong khi điều này không trả lời câu hỏi của bạn, đây là những gì tôi có thể sẽ làm trong tình huống này.Mặc dù tôi thường thích thành phần trên thừa kế và do đó dường như không gặp phải tình huống này. :-) – Waldheinz
@Andrey, tiếc là "mục tiêu chính" của bạn không thực sự có thể có trong hệ thống kiểu Java. Bạn có thể trả lại một cái gì đó được đảm bảo để thực hiện một giao diện cụ thể, nhưng bạn không thể diễn tả "một cái gì đó thực hiện cả hai giao diện này." –