右侧的Scala类型注释?

时间:2016-12-05 09:12:37

标签: scala

在scala中,如果我有这样的声明:

val i: Float = 5

这就像这一行一样:

val i = 5: Float 

最近我在右侧遇到了一个带有这种类型注释的表达式,我想知道它的用法是什么,因为我在规范中找不到它。

1 个答案:

答案 0 :(得分:4)

这称为类型归属,当有多个选项可用时,它意味着消除类型歧义。

典型的例子是折叠:

val l = 1 to 5
val stringyfied = l.foldLeft(Nil)((list, elem) => elem.toString :: list)

在这种情况下Nil的类型是什么?如果您尝试该示例,编译将发出错误:

error: type mismatch;
found   : List[String]
required: scala.collection.immutable.Nil.type

我们可以使用类型归属使编译器知道特定类型:

val stringyfied = l.foldLeft(Nil:List[String])((list, elem) => elem.toString :: list)
// stringyfied: List[String] = List(5, 4, 3, 2, 1)

另一个常见用途是将集合视为vararg,如下所示:

def varargs(a:Int*) = a.sum
// common use:
varargs(1,2,3,4,5) //15

// now we have a collection of elements: 
val intlist = 1 to 5
// we cannot call varagrs with a list
varargs(intlist)
> found   : List[Int]
> required: Int

// then using type ascription:
varargs(intlist: _*)

据我所知,除了表达式代数SLS#Chapter6

的规范之外,没有太多关于类型归属的具体文档。