2010-07-31 35 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

相关问题