Đối với những gì đáng giá, đây là phần liên quan của JLS thực thi quy tắc này.
Thứ nhất, §8.4.8.2. Hiding (by Class Methods) đưa ra một định nghĩa cho phương pháp ẩn mà áp dụng ở đây:
Nếu một lớp C tuyên bố hoặc được thừa hưởng một phương pháp static
m
, sau đó m
được cho là ẩn bất kỳ phương pháp m'
, nơi chữ ký của m
là một phần phụ (§8.4.2) chữ ký của m'
, trong các lớp siêu lớp và siêu kết nối của C mà nếu không sẽ có thể truy cập được mã trong C.
Sau đó, §8.4.8.3. Requirements in Overriding and Hiding khẳng định rằng:
Một phương pháp đó sẽ ghi đè hoặc ẩn một phương pháp khác, bao gồm cả các phương pháp mà thực hiện abstract
phương pháp quy định tại các giao diện, có thể không được công bố để ném nhiều kiểm tra ngoại lệ so với phương pháp ghi đè hoặc ẩn.
Chính xác hơn, giả sử rằng B là một lớp hoặc giao diện, và A là một lớp cha hoặc superinterface của B, và một phương pháp kê khai m2
trong ghi đè B hoặc ẩn một phương pháp kê khai m1
trong A. Sau đó:
Nếu m2
có điều khoản throws
đề cập đến bất kỳ loại ngoại lệ đã chọn nào, thì m1
phải có điều khoản throws
hoặc xảy ra lỗi biên dịch.
Đối với mỗi kiểm tra loại trừ được liệt kê trong throws
khoản của m2
, cùng một lớp ngoại lệ hoặc một trong những siêu kiểu của nó phải xảy ra trong tẩy xoá (§4.6) của throws
khoản của m1
; nếu không, một lỗi biên dịch sẽ xảy ra.
Nói cách khác, thông báo lỗi không phải là một sự giám sát trong các trình biên dịch, hoặc một sự hiểu sai của spec; JLS thực hiện nỗ lực cụ thể để đề cập đến các xung đột khoản throws
xung đột là lỗi khi ẩn phương thức (tức là, với phương pháp tĩnh). Có ngôn ngữ tương đương với điều này trong mọi phiên bản của JLS trở lại 1.0.
Tuy nhiên, tôi không thể trả lời dứt khoát câu hỏi của bạn về số lý do tại sao ràng buộc có trong trường hợp này. Tôi không thể quan niệm về bất kỳ tình huống nào trong đó ràng buộc là cần thiết, vì vấn đề thực thi phương thức tĩnh được gọi luôn luôn được giải quyết hoàn toàn tại thời gian biên dịch, không giống như các phương thức ví dụ.
Tôi đặt cược một khoản tiền nhỏ mà bất kỳ ai đặt ràng buộc đầu tiên trong langspec chỉ đơn giản là thận trọng, cho rằng an toàn hơn để ngăn chặn điều gì đó hơn là cho phép và sau đó phát hiện ra nó gây ra sự cố.Thiết kế ngôn ngữ Java là/không phải không có chia sẻ công bằng các tính năng thiếu sót (các trường hợp ngoại lệ đã kiểm tra là một trong số chúng), và điều này có thể là một cách khác, nhưng đây chỉ là một phỏng đoán.
Chìa khóa ở đây là chính là phương pháp 'tĩnh', có vẻ như bạn đã bỏ qua phần đó của câu hỏi hoàn toàn. Tính đa hình không áp dụng cho các phương thức 'tĩnh'. EDIT: Tôi nhớ nghe điều này thay đổi trong Java 8, mà cho tiết lộ đầy đủ tôi đã không được sử dụng. –