5

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

val b:A = new B

或者

val b = new B
val b2:A = b

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

顺便问一下,这个有什么名字吗?

4

2 回答 2

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)
于 2012-06-08T06:36:21.627 回答
9

我认为它类似于针对接口编程的习惯用法。通过做

val b:A = new B

你确保在那之后你不依赖任何其他的东西,而不是A. 即,它保证如果你决定改变b:A = new C什么都不会破坏。

于 2012-06-08T06:09:42.363 回答