在scala中,如果我有这样的声明:
val i: Float = 5
这就像这一行一样:
val i = 5: Float
最近我在右侧遇到了一个带有这种类型注释的表达式,我想知道它的用法是什么,因为我在规范中找不到它。
答案 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
的规范之外,没有太多关于类型归属的具体文档。