2012-06-05 34 views
5

Tôi đang tìm một phần liên quan của Đặc tả Ngôn ngữ Java (JLS) mô tả hành vi khi gọi phương thức arity (vararg) biến.Phần nào của Đặc tả Ngôn ngữ Java mô tả hành vi của các vararg bị bỏ qua?

xem xét phương pháp:

public static void printVarArgs(String... args) { 
    System.out.println(Arrays.toString(args)); 
} 

Nếu tôi gọi phương pháp này như sau:

printVarArgs(); 

Kết quả sẽ trông giống như: [] vì thiếu sót của args tại địa điểm cuộc gọi đã được chuyển đổi thành một mảng trống trong phương thức printVarArgs.

Tôi đang tìm điểm JLS xác định hành vi này. Gần nhất tôi đã tìm thấy là 15.12.4.2 Evaluate Arguments, nhưng nó không đưa ra ví dụ này và tôi không chắc liệu trường hợp này có thực sự được mô tả chính thức/toán học hay không.

Phần nào của JLS mô tả việc tạo tự động một mảng trống khi một vararg bị bỏ qua?

Trả lời

4

Các văn bản về điều đó phần JLS nói:

Nếu phương pháp được gọi là một phương pháp arity biến (§8.4.1) m, nó nhất thiết có n > 0 thông số chính thức. Thông số chính thức cuối cùng của m nhất thiết phải có loại T[] đối với một số T và m nhất thiết phải được gọi với k >= 0 các biểu thức đối số thực tế.

Nếu m được gọi với các biểu thức lý luận thực tế kn, hoặc, nếu m đang được gọi với k != n biểu tranh luận thực tế và các loại hình biểu tranh luận thứ k không phải là nhiệm vụ tương thích với T[], sau đó danh sách đối số (e1, ... , en-1, en, ...ek) được đánh giá là nếu nó được viết là (e1, ..., en-1, new T[]{en, ..., ek}).

Trong trường hợp bạn đang nói về, có k == n - 1 luận chính thức, vì vậy en, ..., ek là một chuỗi rỗng, và điều đó có nghĩa là các lập luận được đánh giá như thể nó là (e1, ..., en-1, new T[]{}).

Nói cách khác, hành vi được chỉ định trong phần bạn đang xem.

5

Từ JLS 15.12.4.2:

Tham số chính thức cuối cùng của m nhất thiết phải có kiểu T [] đối với một số T và m được thiết được gọi với k> = 0 biểu tranh luận thực tế.

Đó là từ phối cảnh callee. Tôi không chắc nó ở đâu từ quan điểm của người gọi hành vi mà bạn trích dẫn, nhưng đó là loại ngụ ý.

+0

Xin chào, cảm ơn bạn đã trả lời. Tôi đã +1, nhưng tôi chấp nhận câu trả lời khác khi tôi thấy nó giải thích một chút. – Grundlefleck

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