"val a:A =新B",有什么意义?

Ash*_*ary 5 types scala type-inference

这个成语(?)在楼梯书中出现了很多次:

val b:A = new B
Run Code Online (Sandbox Code Playgroud)

要么

val b = new B
val b2:A = b
Run Code Online (Sandbox Code Playgroud)

除了试图在教科书中提出一些观点之外,你为什么要声明一种与推断类型不同的类型?

顺便说一句,这个名字是什么?

par*_*tic 14

它可用于:

  1. 描述程序员的意图(我创建了一个B,但我只对A行为感兴趣)
  2. 确保您只使用A中定义的方法.它将允许稍后交换具体实现,而无需更改大部分代码.
  3. 使用IDE或REPL时,简化可用的自动完成列表.
  4. 在某些时候强制进行隐式转换.

对于更复杂的实例化,它确保推断类型是正确的.例如

sealed trait Answer
case object Yes extends Answer
case object No extends Answer

scala> val a = List( Yes, Yes, No )
a: List[Product with Serializable with Answer] = List(Yes, Yes, No)

scala> val b: List[Answer] = List( Yes, Yes, No )
b: List[Answer] = List(Yes, Yes, No)
Run Code Online (Sandbox Code Playgroud)


aio*_*obe 10

我认为它类似于对接口编程的习惯用语.通过做

val b:A = new B
Run Code Online (Sandbox Code Playgroud)

你确保在那之后你不依赖于提供的界面以外的任何东西A.即,它保证如果你决定改变b:A = new C什么都不会破坏.

  • 我会说这是相关的,但不同.通过明确地提供"b"类型并不能保证从"新B"到"新C"时程序的行为保持不变.Liskov替代原则似乎是一个更概念/更高概念. (3认同)