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

时间:2010-07-31 16:20:41

标签: scala function contravariance

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

List[(Any)=>Unit]

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

String=>Unit

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

2 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分: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>)