2012-10-14 58 views
5

我是新來的Scala,目前學習Scala中的類型參數,我遇到以下情況。Scala中的子類型和類型參數

假設我有2個類別AB,其中BA的子類型。

class A { 
... 
} 

class B extends A { 
... 
} 

所以我可以說B <: A

這是否也意味着List[B] <: List[A]

+3

它也很好地解釋了Martin Odersky的Scala課程(https://class.coursera.org/progfun-2012-001/lecture/83),但您必須註冊,但這是值得的它:-) –

回答

19

在List的情況下,B <: A確實意味着List[B] <: List[A],因爲List的類型參數是協變的。製作類型參數協變意味着它只能在List的定義中出現在協變位置,即它只能顯示爲方法的返回類型,而不能顯示爲參數的類型。 「斯卡拉之旅」包含一個關於variance的部分。維基百科也有很好的article about variance。這三個選項的類型參數的變化是:

  • 不變性:C[A]不是C[B]一個亞型,不管是什麼AB之間的關係。這樣的例子是可變數據結構,例如數組。
  • 協方差:B <: A意味着C[B] <: C[A]。示例是不可變數據結構或返回類型的函數。
  • 逆變:A <: B暗示C[B] <: C[A]。例如,函數在它們的參數類型中是相反的。