Không được phép vì JLS says so. Cú pháp chỉ được phép trong các khai báo và trong các biểu thức tạo mảng.
Sau đó cung cấp một cách khác để đạt được kết quả tương tự:
int[] a;
a = new int[]{1, 2, 3, 4};
Đối với nguyên nhân sâu xa thực tế cho yêu cầu new T[]
, tôi đoán là như sau. Xem xét khởi tạo mảng sau:
{1, 2, 3, 4}
Nó có thể được sử dụng để khởi mảng của các loại khác nhau:
new int[]{1, 2, 3, 4};
new float[]{1, 2, 3, 4};
new double[]{1, 2, 3, 4};
Nếu bit new T[]
được không cần thiết, tôi nghi ngờ rằng trần {1, 2, 3, 4}
có thể gây khó khăn trong phân tích ngữ nghĩa. Ở đây, tôi đang suy nghĩ về các trường hợp như:
void f(float[] x) { ... }
void f(double[] x) { ... }
void g() {
f({1, 2, 3, 4});
}
Nếu cú pháp này được cho phép, thông số ngôn ngữ sẽ phải đối phó với độ phức tạp của việc chọn chức năng gọi.
Trong một mạch tương tự, không rõ loại nào là loại {null}
. Nó có thể là Object[]
, Integer[]
, Serializable[]
và cứ tiếp tục như vậy.
Và cuối cùng, mảng trống {}
sẽ là điều khó khăn nhất. Ở đây, chúng ta thậm chí không thể biết đó là một mảng các đối tượng hay một mảng các vô hướng.
Thay vì giải quyết tất cả những phức tạp này, có vẻ như các nhà thiết kế ngôn ngữ đã chọn để tránh chúng bằng cách yêu cầu cú pháp new T[]
.
Đây không phải là bản sao. OP đang hỏi * tại sao * không * cách *. – Jeremy
Meh; không tin rằng đó là một câu hỏi liên quan đến dupe nói "làm thế nào để tôi làm điều đó để nó hoạt động", câu hỏi này hỏi "tại sao cách khác thực sự không hiệu quả". Sự khác biệt dẫn đến các câu trả lời hoàn toàn khác nhau - câu hỏi này đã có * cách * để làm cho nó hoạt động. –
Những loại câu hỏi này thú vị, nhưng khá nhiều điều không thể trả lời - tất cả những gì chúng ta có thể làm là suy đoán. Thật là thú vị khi hỏi điều này về bất cứ ai đã viết phần nào của spec, mặc dù, như là một thời điểm giảng dạy (tại sao bạn lại làm thiết kế này chứ không phải vậy?). – yshavit