函数参考中的协方差

时间:2017-03-14 18:57:02

标签: scala

假设我定义了以下列表和两个函数引用:

var list = List[Any => String]()

val f1: Any => String = _.toString
val f2: Int => String = _.toString

当我尝试将它们添加到列表中时:

list :+= f1
list :+= f2

我的第二行不会编译时出现以下错误:

  

发现:列表[Int =>字符串]

     

必需:列出[Any =>字符串]

有没有什么方法可以定义我的列表来使Any参数协变,所以我可以分配除'Any'参数以外的函数?

1 个答案:

答案 0 :(得分:4)

  

我是否有某种方法可以定义我的列表以使Any参数协变,因此我可以分配除了' Any'之外的功能。参数Δ

没有,因为FunctionN的参数类型是逆变Any => A位于类型树的 bottom 附近。 Any => StringInt => String,但不是相反。

Any => String是一个可以接受任何作为参数的函数,并返回String。它知道在所有情况下要做什么,因为每种类型都扩展Any。但只有Int => String 处理Int个参数,因此有无数种类型无法作为参数处理,并将其转换为Any => String不会合理。它会失败。

想象一下,您将f2更改为:

 val f2: Int => String = i => (i * 2).toString

如何更改它以使用Any?答案是你不能。