2009-12-21 39 views

Trả lời

18

Bởi vì [ "[email protected]"] kết quả là một ArrayList, không phải là một mảng:

groovy:000> o = ["asdf"] 
===> [asdf] 
groovy:000> o.getClass() 
===> class java.util.ArrayList 

OTOH khai của bạn tạo một mảng các Đối tượng:

groovy:000> Object[] args = ["asdf"] 
===> [Ljava.lang.Object;@14e113b 

và t phương pháp mà anh đang gọi cần một mảng. Bạn có thể tạo một mảng sử dụng as:

Object[] args = ["asdf"] as Object[] 

Những người sáng tạo Groovy thực hiện một điểm làm cho cấu trúc dữ liệu cấp cao hơn như danh sách thành ngữ, trong khi mảng có mặt cho khả năng tương tác với Java.

Trong cuộc phỏng vấn của mình trong Coders tại nơi làm việc Guy Steele nói về sự lựa chọn thực hiện trong việc thiết kế một ngôn ngữ:.

"Có mã hóa vấn đề Huffman này Nếu bạn thực hiện một cái gì đó ngắn gọn, một cái gì đó đang xảy ra để phải Vì vậy, trong việc thiết kế một ngôn ngữ, một trong những điều bạn nghĩ là, ' điều gì tôi muốn làm rất dễ nói và rất dễ để có được phải không?' Nhưng với sự hiểu biết rằng, có sử dụng ký tự hoặc biểu tượng cho mục đích đó, bạn sẽ phải làm một cái gì đó khác khó hơn một chút để nói. "

Dường như Groovy tạo danh sách ngắn gọn hơn, với hiệu ứng phụ khiến mảng trở nên tiết kiệm hơn.

+0

có ý nghĩa, nhưng dường như làm cho phương pháp một rắc rối để sử dụng, tôi đoán tôi mong đợi nó để được nhiều hơn "groovy" –

+1

Bạn có thể thay đổi nó để ["[email protected]"]. toArray(). Không tốt hơn nhiều nhưng ít nhất là nội tuyến. –

1

Nathan đã (chính xác) giải thích lý do cho hành vi này ở cấp độ ngôn ngữ. Tôi chỉ muốn di chuyển một mức độ trừu tượng lên: Tại sao bạn sử dụng trực tiếp số MessageSource của Spring, ngay từ đầu? Trong Grails có một message tag, mà kết thúc tốt đẹp các nguồn thông điệp:

g.message(code: 'UserService.msg.forgot.unknown', args: ["[email protected]"]) 
Các vấn đề liên quan