2012-06-08 57 views
5

這個成語出現在樓梯書中好幾次:「val a:A = new B」,有什麼意義? (?)

val b:A = new B 

val b = new B 
val b2:A = b 

除了想在教科書做出一些點,你爲什麼要申報類型不同於推斷類型的東西?

順便說一句,這個任何名字?

+0

我會說這就是所謂的多態 – maxmc

+1

@maxmc但對象仍然是多態的,沒有它.. – 2012-06-08 14:53:46

+0

@maxmc你細說究竟這是多態性: - ?像pst我也相信這不完全是多態的意思...... –

回答

10

我認爲它與接口編程的習慣相似。通過這樣做

val b:A = new B 

您確保這一點後,你不靠別的比A提供的接口。也就是說,如果您決定更改爲b:A = new C,則不會中斷。

+0

我相信它被稱爲Liskov替代原則(http://en.wikipedia.org/wiki/Liskov_substitution_principle)。 – thoredge

+3

我會說這是相關的,但不同。通過明確提供「b」類型並不能保證程序的行爲在從「新B」轉到「新C」時保持不變。 Liskov替代原則似乎是一個更概念/更高的概念。 – aioobe

+1

這被稱爲_type ascription_。通過聲明'b:A',您可以將'A'類型賦值爲'B'類型的值。你有效地說,「就我而言,這個東西只是一個A」。你也可以把這個聲明寫成'val b = new B:A'。 –

14

它可以是有用的:

  1. 描述程序員意圖(我創建了一個B,但我感興趣的只有A行爲
  2. 確保你將只能使用定義的方法答:它將允許稍後交換具體的實現 ,而不必更改大部分代碼。
  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)