2010-01-05 4 views
6

Sau đây Groovy đang in "nó hoạt động"Generics trong Groovy

def printIt(Class<? extends Exception> clazz) { 
    println "it works" 
} 

printIt(String.class) 

mặc dù thông số không đáp ứng các hạn chế Class<? extends Exception>

hiểu biết của tôi là điều này là bởi vì:

  1. Loại xóa trong Generics Java có nghĩa là không có kiểu generic chung nào kiểm tra
  2. Không có kiểm tra kiểu thời gian biên dịch trong Groovy

Hai điểm này có nghĩa là không kiểm tra hiệu quả các loại generic bị chặn trong Groovy. Có cách nào tôi có thể kiểm tra (khi chạy) mà đối tượng Class truyền cho printIt đáp ứng các hạn chế ? extends Exception

Cảm ơn, Don

Trả lời

4

Check-out link này.

[...] Trong một số cách này là mâu thuẫn với nhấn mạnh của ngôn ngữ năng động, nơi ở Nhìn chung, các loại của các đối tượng có thể không được xác định cho đến khi thời gian chạy. Nhưng Groovy nhằm mục đích để chứa mã số của Java khi có thể, do đó Groovy 1.5 giờ cũng hiểu được Generics. Có nói rằng, hỗ trợ generics Groovy không nhằm mục đích trở thành một bản sao hoàn chỉnh của Generics Java của . Thay vào đó, Groovy nhằm mục đích cho phép generics ở cấp mã nguồn (để hỗ trợ cắt và dán từ Java) và cũng có thể ở nơi nó có ý nghĩa để cho phép tích hợp tốt giữa Groovy và Java công cụ và API sử dụng Generics. ..]

Tóm lại, tôi không nghĩ rằng có thể có được thông tin đó khi chạy.

+0

Tôi tự hỏi chính xác những gì có nghĩa là: 'Groovy hiện đang tiến xa hơn một chút và ném đi thông tin generics "ở cấp nguồn"' –

+1

Tôi nghĩ điều này có nghĩa là thông tin chung được bỏ qua trong groovy. Trong Java, thông tin generics được loại bỏ nhưng các phôi thích hợp và kiểm tra kiểu tĩnh được thực hiện. –

1

Kể từ khi bạn biết điều đó là nghĩa vụ phải là một ngoại lệ, công trình này trong Java (hoặc Groovy):

// true if the class is a subclass of Exception 
Exception.class.isAssignableFrom(clazz); 

Đó không có cách nào sử dụng thông tin chung chung, nhưng điều đó sẽ không có sẵn trong Java một trong hai.