首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >右方的Scala类型注释?

右方的Scala类型注释?
EN

Stack Overflow用户
提问于 2016-12-05 09:12:36
回答 3查看 201关注 0票数 2

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

代码语言:javascript
运行
复制
val i: Float = 5

这与这一行相同吗:

代码语言:javascript
运行
复制
val i = 5: Float 

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-12-05 11:36:58

这被称为类型归属,它用于在可能有几个选项可用时消除类型的歧义。

一个典型的例子是褶皱:

代码语言:javascript
运行
复制
val l = 1 to 5
val stringyfied = l.foldLeft(Nil)((list, elem) => elem.toString :: list)

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

代码语言:javascript
运行
复制
error: type mismatch;
found   : List[String]
required: scala.collection.immutable.Nil.type

我们可以通过使用类型归属使编译器知道特定的类型。

代码语言:javascript
运行
复制
val stringyfied = l.foldLeft(Nil:List[String])((list, elem) => elem.toString :: list)
// stringyfied: List[String] = List(5, 4, 3, 2, 1)

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

代码语言:javascript
运行
复制
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 )之外,没有多少关于类型归属的具体文档

票数 4
EN

Stack Overflow用户

发布于 2016-12-05 09:45:14

此语法用于将类型分配给表达式(而val i: Float = 5将类型分配给术语)。当你用一个更大的表达式的一部分来做它时,它会产生不同的效果。

代码语言:javascript
运行
复制
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
票数 3
EN

Stack Overflow用户

发布于 2016-12-05 09:58:24

我认为唯一的区别是,(由编译器)从第二个示例中的值推断出i的类型,而在第一个示例中,您将明确说明i的类型。

stye准则鼓励在可能的情况下使用推理类型。但是,它还提到认为,在使用“归属”(一种编译时间向上转换)时,使用该类型的值所使用的语法是一种方法。

代码语言:javascript
运行
复制
scala> val s = "Jane"
s: String = Jane

scala> val p = s: Object
p: Object = Jane
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40970684

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档