我需要一個泛型函數的集合,但我無法按照我喜歡的方式完成它。 我創建了一個Scala:使用函數作爲第一類對象的問題
List[(Any)=>Unit]
但只要我嘗試插入功能,例如
String=>Unit
我得到一個錯誤。我怎麼能聲明一個不考慮參數和返回值類型的通用函數集合?
我需要一個泛型函數的集合,但我無法按照我喜歡的方式完成它。 我創建了一個Scala:使用函數作爲第一類對象的問題
List[(Any)=>Unit]
但只要我嘗試插入功能,例如
String=>Unit
我得到一個錯誤。我怎麼能聲明一個不考慮參數和返回值類型的通用函數集合?
剛剛完成@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>)
函數在輸入類型參數中是不相容的,例如,在你的情況下Function1[-T1,+R]
。這意味着您可以將Any => Unit
的實例添加到List[String => Unit]
,但不能相反。這當然很有意義,因爲您無法調用期望類型爲String
的參數的函數,其參數類型爲Any
。
你將如何調用與簽名'(沒有)=> Any'的功能? – 2010-08-01 02:55:41
你不能,沒有演員。但這個問題並沒有要求:) – retronym 2010-08-01 06:27:09
有沒有辦法動態獲取(也許通過反射)函數的實際類型,以便我可以執行演員? – mariosangiorgio 2010-08-04 10:22:34