2013-07-29 28 views
6

Nếu bạn đang xác định một biến, nó dường như là hoàn toàn hợp lệ để khai báo/định nghĩa một biến như sau:Trong Java, khi nào mảng {a, b, c, ...} viết tắt là không phù hợp và tại sao?

double[][] output = {{0,0},{1,0}}; 

Nhưng nếu bạn đang trở về một giá trị, nó dường như là không hợp lệ để viết như sau :

public double[] foo(){ 
     return {0,1,2} 
    } 

Tôi đã nghĩ rằng nội bộ, cả hai đều sẽ thực hiện cùng một hành động. Eclipse, ít nhất, không đồng ý. Có ai biết sự khác biệt là gì, và nơi nào khác nó có thể được nhìn thấy, hoặc tại sao nó sẽ có lợi để chấp nhận ví dụ cũ và từ chối sau này?

Chỉnh sửa: OK, vì vậy nó phù hợp khi bạn khởi tạo, nhưng tôi không thấy bất kỳ sự mơ hồ nào ... JVM không thể giải thích loại biến từ tên biến (trong trường hợp xác định lại đã được khởi tạo biến) hoặc khi trở về (nơi JVM chỉ có thể nhìn vào kiểu trả về của hàm)? Điều gì làm cho khởi tạo một trường hợp đặc biệt của một quy tắc mà sẽ cấm loại ngầm? Điều gì làm cho quy tắc chung yêu cầu loại rõ ràng?

Trả lời

5

Nó chỉ có thể chấp nhận trong một tuyên bố. Tuy nhiên, bạn có thể sử dụng new double[] {0, 1, 2}.

JLS §10.6:

Một mảng initializer có thể được quy đị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.

Biểu thức tạo mảng là cú pháp new double[] { }.

+0

"Chỉ chấp nhận được trong một tuyên bố". Tại sao? Tại sao không trong một tuyên bố trở lại? –

+0

@JohnP Vì ngôn ngữ không cho phép. Theo tôi biết, không có trường hợp tốt chống lại nó (tôi đoán trình biên dịch có thể phải làm một chút suy luận kiểu hơn để đảm bảo việc tạo ra là an toàn). – Jeffrey

12

Bạn chỉ có thể sử dụng ký hiệu dấu ngoặc đơn tại điểm khai báo, nơi trình biên dịch có thể suy ra loại mảng từ loại khai báo.

Để sử dụng nó bất cứ nơi nào khác mà bạn cần phải sử dụng Array Creation Expression:

return new double[] {0,1,2}; 
+0

"Để sử dụng ở bất kỳ nơi nào khác, bạn cần sử dụng Biểu thức tạo mảng". Tại sao? Tại sao câu lệnh trả về không thể sử dụng cùng một ký hiệu? –

+0

@JohnP. Bởi vì, Trình tạo ngôn ngữ Java đã thiết kế theo cách đó. Xem [JLS Phần 10.6] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-10.html#jls-10.6). –

+0

Không, tôi không nghĩ vậy. Nếu tôi hỏi tại sao chim phát triển lông thay vì lông thú, nói rằng "bởi vì người tạo ra nó theo cách đó" sẽ không ở đâu gần đạt yêu cầu, phải không? Tôi có nhiều khả năng chấp nhận câu trả lời của Jeffrey hoàn toàn bởi vì bạn cầu xin. –

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