我需要一个泛型函数的集合,但我无法按照我喜欢的方式完成它。 我创建了一个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