“[]” Kỳ lạ sau chữ ký phương thức Java


119

Hôm nay tôi đã xem một số mã Java và tôi thấy một số cú pháp kỳ lạ:

public class Sample {
  public int get()[] {
    return new int[]{1, 2, 3};
  }
}

Tôi nghĩ rằng không thể biên dịch và muốn sửa những gì tôi nghĩ là lỗi đánh máy, nhưng sau đó tôi nhớ rằng trình biên dịch Java đã thực sự chấp nhận nó!

Ai đó có thể vui lòng giúp tôi hiểu ý nghĩa của nó không? Nó có phải là một mảng các hàm không?


10
woah, mà của .. lạ ...; D
Nanne


2
Điều ... Điều kỳ quặc nhất mà tôi từng thấy. Họ nói ruby ​​có rất nhiều ma thuật, hãy ăn ruby ​​đó!
IAdapter

16
Thậm chí không trông lạ so với chữ ký của một hàm trả về một con trỏ tới mảng con trỏ đến các hàm trong C. :)
Kos

Câu trả lời:


111

Đó là một phương thức trả về một int[].

Đặc tả ngôn ngữ Java (8.4 Khai báo phương thức)

Để tương thích với các phiên bản cũ hơn của nền tảng Java, biểu mẫu khai báo cho một phương thức trả về một mảng được phép đặt (một số hoặc tất cả) các cặp dấu ngoặc trống tạo thành khai báo kiểu mảng sau danh sách tham số.

Điều này được hỗ trợ bởi sản xuất lỗi thời:

Bộ phân tích phương pháp :
    MethodDeclarator []

nhưng không nên được sử dụng trong mã mới.


92
Điều tốt nhất của điều này là nó là một số hoặc tất cả . Vì vậy, nếu bạn có một phương thức trả về một mảng ints 3 chiều, bạn có thể làm: public int[] foo()[][] {và làm cho mắt mọi người chảy máu.
Cowan

Tôi phải nói rằng tôi đã cười lớn kể từ khi tôi nhìn thấy mã đó! :-D
sdlins

20

Đó là một câu hỏi vui. Trong java, bạn có thể nói int[] a;, cũng như int a[];.
Từ quan điểm này, để có được kết quả tương tự, chỉ cần di chuyển []
và ghi public int[] get() {.
Vẫn có vẻ như mã đến từ một công cụ giải mã ...


2
Từ một obfuscator? Nhiều khả năng là từ một lập trình viên C (bạn không thể trả về một mảng mà là một con trỏ tới kiểu mảng - vâng .. và nó trông tương tự).
Kos

4
@Kos: Tại sao bạn lại ngụ ý rằng một obfuscator và một lập trình viên C phải là hai thứ khác nhau? Nhiều khi họ không như vậy!
Lii

10

Vì có thẻ C, tôi sẽ chỉ ra rằng có thể có ký hiệu tương tự (nhưng không giống nhau) trong C và C ++:

Ở đây, hàm ftrả về một con trỏ đến một mảng 10 int.

int tab[10];

int (*f())[10]
{
    return &tab;
}

Java đơn giản là không cần dấu sao và dấu ngoặc đơn.


có cú pháp nào dễ dàng hơn cho một hàm trả về một con trỏ đến một mảng n chiều không? (Không chỉ là một int *)
ted vào

Trên thực tế, tôi phải nói thêm, pcc hỗ trợ trực tiếp f()[]có nghĩa là một cái gì đó như (*f()).
AnArrayOfFunctions Ngày

4

cú pháp của java cho phép những điều sau:

int[] intArr = new int[0];

và cả

int intArr[] = new int[0];

trông khác lạ hơn đến từ cú pháp kiểu c.

vì vậy, với một hàm, tên có thể đứng trước hoặc sau [], và kiểu vẫn là int []


1
Điều này thực sự làm phiền tôi vì nó thực sự nên là int [] vì thực tế nó là một mảng là một phần của kiểu, không phải là một phần của tên của nó. Người postgrad viết các khóa học uni java của tôi lúc nào cũng làm ngược lại trong mã của anh ta, thật kinh khủng!
danpalmer

1
@danpalmer, tôi đồng ý, mặc dù hãy đặt mình vào vị trí của một lập trình viên ac, người bẩm sinh đã có sẵn nó trong máu để viết tên int []. Dù sao, nó không phải là một vấn đề lớn như vậy, ngôn ngữ hỗ trợ cả hai và hầu hết các lập trình viên java sử dụng quy ước int [], vì vậy, ngoại trừ một hoặc hai ngôn ngữ postgrad khó chịu thì nó rất hiếm. ai biết được, nó thậm chí có thể có lợi cho bạn nếu họ hỏi một câu hỏi như thế này trong phần cuối cùng của bạn
davin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.