5

我需要一个通用函数的集合,但我无法以我喜欢的方式完成它。我创建了一个

List[(Any)=>Unit]

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

String=>Unit

我得到一个错误。我如何声明一个不考虑参数和返回值类型的通用函数集合?

4

2 回答 2

11

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

于 2010-07-31T16:27:43.907 回答
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>)
于 2010-07-31T17:10:36.417 回答