函数[Any,String] Trait和Variance

时间:2014-02-19 16:55:48

标签: scala variance

Scala in Depth显示以下差异示例。

scala> trait Function[-Arg, +Return] {
     |  def apply(arg: Arg): Return
     | }
defined trait Function

scala> val foo = new Function[Any, String] {
     |  override def apply(arg: Any): String =
     |    "Hello. I received " + arg
     | }
foo: Function[Any,String] = $anon$1@5db0e244

scala> val bar: Function[String, Any] = foo
bar: Function[String,Any] = $anon$1@5db0e244

我们可以将foo分配给bar的原因是什么?我有一个粗略的想法,但我想我会直接问。

1 个答案:

答案 0 :(得分:3)

正是因为方差注释使Function[Any, String]成为Function[String, Any]的子类型。

协方差注释,+表示较窄的类型参数产生较窄的构造类型,而逆变注释-,意味着较宽的类型参数产生较窄的构造类型。