Scala:使用函数作为第一类对象的问题

mar*_*gio 5 scala function contravariance

我需要一组通用函数,但我不能按照我喜欢的方式完成它.我创造了一个

List[(Any)=>Unit]
Run Code Online (Sandbox Code Playgroud)

但是一旦我尝试插入一个函数,例如a

String=>Unit
Run Code Online (Sandbox Code Playgroud)

我收到一个错误.我怎么能声明一个不考虑参数和返回值类型的泛型函数集合?

Mor*_*itz 11

函数在intput类型参数中是逆变的,例如在您的情况下Function1[-T1,+R].这意味着您可以添加一个实例Any => UnitList[String => Unit]而不是倒过来.这当然是有道理的,因为你不能调用一个函数,期望一个String带有类型参数的类型的参数Any.


ret*_*nym 9

只是为了完成@Moritz答案,你需要选择类型参数,因为T1它是列表中每个函数的输入类型的子类型.Nothing符合条件 - 它是每种类型的子类型.

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

存在类型也有效:

scala> val l: List[_ => _] = List((b: String) => b, (a: Int) => a)        
l: List[Function1[_, _]] = List(<function1>, <function1>)
Run Code Online (Sandbox Code Playgroud)