在scala中,如果我有这样的声明:
val i: Float = 5这与这一行相同吗:
val i = 5: Float 最近,我遇到了一个在右侧有这样的类型注释的表达式,我想知道它的用法是什么,因为我在规范中找不到它。
发布于 2016-12-05 11:36:58
这被称为类型归属,它用于在可能有几个选项可用时消除类型的歧义。
一个典型的例子是褶皱:
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 )之外,没有多少关于类型归属的具体文档
发布于 2016-12-05 09:45:14
此语法用于将类型分配给表达式(而val i: Float = 5将类型分配给术语)。当你用一个更大的表达式的一部分来做它时,它会产生不同的效果。
scala> implicit class WeirdFloat(f: Float) {
     |   def +(ff: Float) = new WeirdFloat(f + ff * 2)
     |   override def toString = s"$f"
     | }
defined class WeirdFloat
scala> val i: WeirdFloat = 5 + 7
i: WeirdFloat = 12.0
scala> val i = (5: WeirdFloat) + 7
i: WeirdFloat = 19.0发布于 2016-12-05 09:58:24
我认为唯一的区别是,(由编译器)从第二个示例中的值推断出i的类型,而在第一个示例中,您将明确说明i的类型。
stye准则鼓励在可能的情况下使用推理类型。但是,它还提到认为,在使用“归属”(一种编译时间向上转换)时,使用该类型的值所使用的语法是一种方法。
scala> val s = "Jane"
s: String = Jane
scala> val p = s: Object
p: Object = Janehttps://stackoverflow.com/questions/40970684
复制相似问题