假设我定义了以下列表和两个函数引用:
var list = List[Any => String]()
val f1: Any => String = _.toString
val f2: Int => String = _.toString
当我尝试将它们添加到列表中时:
list :+= f1
list :+= f2
我的第二行不会编译时出现以下错误:
发现:列表[Int =>字符串]
必需:列出[Any =>字符串]
有没有什么方法可以定义我的列表来使Any参数协变,所以我可以分配除'Any'参数以外的函数?
答案 0 :(得分:4)
我是否有某种方法可以定义我的列表以使Any参数协变,因此我可以分配除了' Any'之外的功能。参数Δ
没有,因为FunctionN
的参数类型是逆变。 Any => A
位于类型树的 bottom 附近。 Any => String
是Int => String
,但不是相反。
Any => String
是一个可以接受任何作为参数的函数,并返回String
。它知道在所有情况下要做什么,因为每种类型都扩展Any
。但只有Int => String
处理Int
个参数,因此有无数种类型无法作为参数处理,并将其转换为Any => String
不会合理。它会失败。
想象一下,您将f2
更改为:
val f2: Int => String = i => (i * 2).toString
如何更改它以使用Any
?答案是你不能。