为什么在RHS而不是LHS中定义类型?

时间:2015-10-11 08:31:47

标签: scala

最近我遇到了一些定义类型的代码,如下所示:

val a = "Hello":String 

而不是:

val a:String = "Hello"

第一种符号是否有任何优势?也许,也许是在汇编中?

2 个答案:

答案 0 :(得分:3)

我能想到的一个边际好处是,第一个符号可以用在里面一个表达式,例如(a: String) + b,如果您不想提供完整类型或想要触发隐式转换(当然,您可以同时执行这两种操作,同时仍然提供左侧的类型)。另一方面,第二个:

  1. 是递归值和方法以及抽象成员所必需的;

  2. 使用得更广泛;

  3. (a + b): String;

    等情况下,
  4. 在表达式周围不需要括号 如果定义需要多行,

  5. 可让您更快地看到签名。

  6. 我无法想到任何其他重大差异。

答案 1 :(得分:0)

这是类型归属。它基本上是scala中的编译时强制转换。我不喜欢

val a = "Hello": String

是一个正确的用途,它应该与val a: String = "Hello"完全相同,但它更难阅读。您可以在REPL中检查它:val b: String = 5val b = 5:String都会在val b = 5.asInstanceOf[String]生成运行时错误时生成编译时错误

然而,类型归属有一些非常好的用法。 a:_*可能是最受欢迎的。您还可以使用它触发隐式转换:

implicit def aToB(i: A): B = A.makeB()

(new A()) : B // will run A.makeB()