2009-12-24 9 views
5

Groovy có phải là một siêu sao của Java chưa? Nếu không, sự không tương thích giữa Groovy và Java là gì?Trình trợ giúp Groovy của Java

Bởi superset, tôi có nghĩa là tương thích ngược nguồn, theo nghĩa là: bạn có thể lấy một tệp Java và biên dịch nó dưới dạng tệp nguồn Groovy, và nó sẽ hoạt động giống như trước đây. Nó đã là mục tiêu của Groovy để làm cho rất giống với Java, để giảm thiểu đường cong học tập. Tuy nhiên, cho đến khi Groovy 1.7 không hỗ trợ cho các lớp bên trong vô danh và như vậy.

Tôi đã thấy một số bài viết đưa ra khiếu nại đó, nhưng tôi chưa thấy xác minh đó trên số Groovy website.

+1

Thực ra, tôi không chắc là tôi hiểu câu hỏi. Bạn có ý nghĩa gì chính xác bằng "nguồn tương thích với"? –

Trả lời

7

Groovy có phải là một siêu của (ví dụ: nguồn tương thích với) Java chưa? Nếu không, sự không tương thích giữa Java và Groovy bây giờ là gì?

Groovy "mở rộng" Java và có sự khác biệt giữa Groovy và Java (một tệp Groovy không thể được biên dịch bởi trình biên dịch Java). Trang Differences from Java liệt kê tất cả các khác biệt chính giữa Java và Groovy. Điều đó nói rằng, trình biên dịch Groovy có thể chuyển đổi một tệp Groovy thành một tệp .class có thể chạy bằng cách sử dụng Java Intepreter (điều này yêu cầu groovy-all-VERSION.jar để nằm trên CLASSPATH). Điều này có trả lời câu hỏi không?

+0

Cảm ơn, tôi đã cập nhật câu hỏi để làm rõ vấn đề của mình. – notnoop

5

Một khác biệt mà tôi không thấy được đề cập trên trang đó là cách các phương thức quá tải được giải quyết. Trong Java, nó dựa trên kiểu biên dịch của một đối số, trong khi trong Groovy nó được dựa trên kiểu thời gian chạy. Nói ví dụ, bạn có các phương pháp này trong một lớp học

void doIt(Object o) {} // Java 
void doIt(String s) {} // Groovy 

Các mã sau đây:

Object o = "foo"; 

sẽ gọi phương thức với các tham số String nếu mã Groovy, và phương pháp này với tham số Object nếu mã Java . Groovy gọi tính năng này là "đa phương thức".

+0

Cảm ơn. Điều này được gọi là "công văn đa phương thức động" trong văn học. – notnoop

1

Trong groovy, các thuộc tính có quyền truy cập gói (tốt, tôi nên gọi các thuộc tính hoặc các biến mẫu) có thể tự động thiết lập và các phương thức getter được biên dịch vào tệp lớp.

Điều đó có nghĩa là nếu bạn lưu tệp * .java dưới dạng tệp * .groovy và bạn có thuộc tính như "Tên chuỗi;" trình biên dịch groovy sẽ tạo ra một setter và một getter. Trình biên dịch java sẽ không. Nếu bạn đã có một getter trong tệp java của bạn, trình biên dịch groovy thậm chí có thể phàn nàn về một định nghĩa phương thức trùng lặp.

Tuy nhiên, trừ trường hợp hiếm hoi, hầu hết các tệp * .java được biên dịch bởi trình biên dịch groovy không có vấn đề.

Angelo

0

Một khác biệt không được liệt kê trên trang đó là việc sử dụng dấu chấm phẩy. Mỗi dòng sẽ có thể kết thúc bằng dấu chấm phẩy (nhưng có thể bỏ qua).

Các mã sau đây không biên dịch trên Groovy, nhưng biên dịch trên Java:

String s = "hello " 
+ "world"; 
println(s); // Assuming there is a local method with name "println" (available by default in Groovy but you have to create it in Java)