2010-07-31 63 views
5

我需要一個泛型函數的集合,但我無法按照我喜歡的方式完成它。 我創建了一個Scala:使用函數作爲第一類對象的問題

List[(Any)=>Unit] 

但只要我嘗試插入功能,例如

String=>Unit 

我得到一個錯誤。我怎麼能聲明一個不考慮參數和返回值類型的通用函數集合?

回答

9

剛剛完成@Moritz的回答,您需要選擇T1的類型參數,它是列表中每個函數的輸入類型的子類型。 Nothing符合法案 - 它是每種類型的子類型。

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

一個存在的類型也可以工作:

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

你將如何調用與簽名'(沒有)=> Any'的功能? – 2010-08-01 02:55:41

+0

你不能,沒有演員。但這個問題並沒有要求:) – retronym 2010-08-01 06:27:09

+0

有沒有辦法動態獲取(也許通過反射)函數的實際類型,以便我可以執行演員? – mariosangiorgio 2010-08-04 10:22:34

11

函數在輸入類型參數中是不相容的,例如,在你的情況下Function1[-T1,+R]。這意味着您可以將Any => Unit的實例添加到List[String => Unit],但不能相反。這當然很有意義,因爲您無法調用期望類型爲String的參數的函數,其參數類型爲Any

相關問題