2010-07-31 30 views
5

Tôi cần phải có một bộ sưu tập các chức năng chung, nhưng tôi không thể hoàn thành công việc theo cách mình muốn. Tôi tạo ra mộtScala: các vấn đề khi sử dụng các chức năng như đối tượng lớp học đầu tiên

List[(Any)=>Unit] 

nhưng ngay sau khi tôi cố gắng để chèn một chức năng, ví dụ như một

String=>Unit 

tôi nhận được một lỗi. Làm thế nào tôi có thể khai báo một bộ sưu tập chức năng chung mà không xem xét các kiểu giá trị tham số và trả về?

Trả lời

9

Chỉ để kết thúc câu trả lời của @Moritz, bạn cần chọn đối số kiểu cho T1 là loại phụ của loại đầu vào của mọi chức năng trong danh sách. Nothing phù hợp với hóa đơn - đó là loại phụ của mọi loại.

scala> val l: List[Nothing => Any] = List((b: String) => b, (a: Int) => a) 
l: List[(Nothing) => Any] = List(<function1>, <function1>) 

Một loại hiện sinh cũng làm việc:

scala> val l: List[_ => _] = List((b: String) => b, (a: Int) => a)   
l: List[Function1[_, _]] = List(<function1>, <function1>) 
+0

Làm thế nào bạn sẽ gọi một hàm với chữ ký '(Không có gì) => Any'? –

+0

Bạn không thể, không có dàn diễn viên. Nhưng câu hỏi đã không gọi cho rằng :) – retronym

+0

Có cách nào để có được động (Có lẽ thông qua phản ánh) các loại thực tế của chức năng, để tôi có thể thực hiện các diễn viên? – mariosangiorgio

11

Các hàm có thể bị biến đổi trong các tham số loại tham số, ví dụ: trong trường hợp của bạn Function1[-T1,+R]. Điều này có nghĩa là bạn có thể thêm một thể hiện của Any => Unit vào một số List[String => Unit] nhưng không phải là cách khác. Điều này tất nhiên có ý nghĩa như bạn không thể gọi một chức năng mong đợi một đối số của loại String với một đối số của loại Any.

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