2009-11-25 25 views
11

tôi đã cố gắng một cái gì đó như thế này:Initialize mảng sử dụng ternary nhà điều hành

 

boolean funkyBoolean = true; 
int array[] = funkyBoolean ? {1,2,3} : {4,5,6}; 
 

Nhưng mã này thậm chí sẽ không biên dịch. Có lời giải thích nào cho điều này không? không phải là funkyBoolean ? {1,2,3} : {4,5,6} một biểu thức hợp lệ? cảm ơn trước!

Trả lời

27

Bạn chỉ có thể sử dụng cú pháp {1, 2, 3} trong các trường hợp rất hạn chế và đây không phải là một trong số chúng. Hãy thử điều này:

int array[] = funkyBoolean ? new int[]{1,2,3} : new int[]{4,5,6}; 

Bằng cách này, phong cách Java tốt là viết tờ khai như:

int[] array = ... 

EDIT: Đối với hồ sơ, lý do mà {1, 2, 3} được rất hạn chế là kiểu của nó là mơ hồ . Về mặt lý thuyết, nó có thể là một mảng các số nguyên, số nguyên, phao, v.v. Bên cạnh đó, ngữ pháp Java như được định nghĩa bởi JLS cấm nó, vậy đó là điều đó.

+0

Cảm ơn lời giải thích Stephen! – marcosbeirigo

+0

Trong JDK7 có vẻ như nếu '{1, 2, 3}' (trong các tình huống khác) sẽ là một tập hợp, với kiểu được xác định bằng cách gõ đích (giống như các phương thức chung, chẳng hạn như 'Arrays.asList'). –

+0

Chỉ cần cho các hồ sơ, thay đổi ngôn ngữ được đề xuất mà bình luận của Tom ám chỉ đã không làm cho nó thành JDK 7. –

5
boolean funkyBoolean = true; 
int[] array = funkyBoolean ? new int[]{1,2,3} : new int[]{4,5,6}; 
3

Một initializer mảng có thể được xác định trong một tuyên bố, hoặc là một phần của một biểu thức tạo mảng (§15.10), tạo ra một mảng và cung cấp một số giá trị ban đầu

Đó là những gì Java Spec nói (10.6). Vì vậy, phiên bản 'ngắn' (với biểu thức sáng tạo) chỉ được phép trong các khai báo (int[] a = {1,2,3};), trong tất cả các trường hợp khác, bạn cần một cấu trúc new int[]{1,2,3}, nếu bạn muốn sử dụng bộ khởi tạo.

+0

Cảm ơn, đó là hữu ích! – marcosbeirigo

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