2015-10-13 20 views
17

Compilingchức năng tham chiếu đến Object.clone() không biên dịch

import java.util.concurrent.Callable; 

class Ideone 
{ 
    Callable<?> x = super::clone; 
} 

sử dụng Oracle JDK cho:

Main.java:6: error: incompatible types: invalid method reference 
    Callable<?> x = super::clone; 
        ^
    clone() has protected access in Object 

mà làm cho không có ý nghĩa như một lớp học sẽ có thể truy cập vào cha mẹ của mình được bảo vệ phương pháp. Biểu thức này hoạt động tốt trong trình biên dịch của Eclipse.

Đồng thời, () -> super.clone() biên soạn tiền phạt ....

Đây có phải là lỗi không?

+2

Có 'tác vụ này :: clone' hoạt động không? – thecoop

+0

Tôi có thể tạo lại điều này với JDK 1.8.0_51 và Eclipse Mars 4.5.0. Có vẻ như một lỗi Eclipse. – Tunaki

+0

Hoạt động tốt JDK 1.8.0_60 và Eclipse Mars – Flown

Trả lời

6

super không thực sự là một biểu thức và không có loại tĩnh để nói về. super.foo() có quyền truy cập giống như this.foo(); nó chỉ là, lời gọi phương thức được dịch khác nhau trong mã byte, như "siêu gọi", như trái ngược với "gọi bình thường".

JLS không rõ ràng về điều này; ví dụ. trong phần của protected access, biểu mẫu super.protectedMember không được đề cập; nhưng rõ ràng là biểu mẫu đó sẽ được thảo luận trong JLS; và nó có thể truy cập được. (Phần đề xuất rằng X::mX.m phải được xử lý cùng quyền truy cập w.r.t.)

Trong phần method reference, từ ngữ cũng mơ hồ; tuy nhiên, super::clone phải có thể truy cập được theo cách tương tự như super.clone() có thể truy cập được.

Báo cáo lỗi đã được tạo: JDK-8139836: “Can't use super::x method reference when x is protected”. Trạng thái hiện tại của nó là nó sẽ được sửa trong Java 9.

+1

quy tắc truy cập được bảo vệ - http://stackoverflow.com/a/32263340/2158288 – ZhongYu

+0

(Vui lòng xem [bình luận] của tôi (# comment54031785_33107500).) 6.6.2.1 được viết bằng ngôn ngữ rất chính xác, vì vậy tôi muốn nói nó không phải mơ hồ về vụ án: trường hợp là nghĩa đen không xác định. Tuy nhiên, vì biểu mẫu này là cần thiết để thực hiện một 'clone()' hữu ích, tôi khó có thể tin rằng nó bị thiếu trong spec đó quá lâu. –

+1

well ... bạn có nói rằng form 'clone()' không đủ tiêu chuẩn cũng không được xác định? có lẽ nó cũng được hiểu rằng nó tương đương với 'this.clone()'.Tương tự, có thể 'super.clone()' được hiểu rõ, trong số các đối tượng mục tiêu của JLS, tương đương với nhiều cách để 'this.clone()' tại thời gian biên dịch. – ZhongYu

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