2015-04-01 34 views
10

Tôi đang chơi xung quanh tính năng mới Java 8 của thời gian gần đây và đã chứng kiến ​​hành vi thú vị:Trong java 8, tại sao không thể gọi giao diện phương pháp tĩnh rằng lớp hiện tại đang triển khai

Đây là okay:

Class A { static void staticMethodInA() {println();} } 
Class B extends A {} 

B.staticMethodInA(); 

Điều này sẽ gây ra lỗi: phương pháp tĩnh có thể được gọi khi chứa lớp giao diện chỉ.

interface A { static void staticMethodInA() {println();} } 
Class B implements A {} 

B.staticMethodInA(); // from here IntelliJ complaints.. 

Ai đó có thể cho tôi biết lý do tại sao nhà thiết kế Java 8 có thể chọn xử lý 2 trường hợp trên khác nhau?

+1

Related: http://stackoverflow.com/questions/129267/why-no-static-methods-in-interfaces-but-static-fields-and-inner-classes-ok – skaffman

Trả lời

20

Bổ sung static phương thức trong giao diện trong Java 8 đi kèm với 1 hạn chế - những phương thức đó không thể được kế thừa bởi lớp triển khai nó. Và điều đó có ý nghĩa, vì một lớp có thể thực hiện nhiều giao diện. Và nếu 2 giao diện có cùng phương thức static, cả hai đều sẽ được kế thừa và trình biên dịch sẽ không biết cái nào cần gọi.

Tuy nhiên, với việc mở rộng lớp học, không có vấn đề gì. static các phương thức lớp được kế thừa bởi lớp con.

Xem JLS §8.4.8:

Một lớp C được thừa hưởng từ cha trực tiếp tất cả các phương pháp m bê tông (cả tĩnh và ví dụ) của lớp cha

...

Một lớp C được thừa hưởng từ siêu lớp trực tiếp của nó và các siêu liên kết trực tiếp tất cả các phương thức trừu tượng và mặc định (§9.4) m

...

Một lớp không kế thừa các phương pháp tĩnh từ các siêu kết nối của nó.

+0

Còn phương pháp tĩnh từ siêu lớp không trực tiếp? –

+0

@Abhijit Sarkar: một lớp kế thừa từ lớp con trực tiếp của nó * tất cả * các phương thức cụ thể, kể cả những phương thức mà lớp cha trực tiếp được thừa hưởng từ lớp cha của siêu lớp và vv… – Holger

Các vấn đề liên quan