2013-04-01 47 views
9

我正在閱讀Programming Scala。我剛剛完成了關於隱式類型轉換的章節,其中引入了<%符號。還有一個<:符號和一個<符號。Scala仿製類型約束條件

有人可以總結不同的類型約束?例如,我正在努力處理<:<之間的差異。我很好奇,如果還有其他人我還沒有涉及。

+0

http://stackoverflow.com/questions/4465948/what-are-scala-context-and-view-bounds的可能的複製也看到http://stackoverflow.com/questions/3427345/what-do-and -mean-in-scala-2-8-and-where-are-they-documented –

+0

@ om-nom-nom我不關心在你列出的文章中提到的操作符。我關注類型約束運算符:'<:', '<%', '>:'等等,它們完全無關。 –

回答

16

沒有類型約束被稱爲<

A <: B裝置A是字面上的B一個亞型(其中亞型本能定義,對於任何類型的T這意味着它的情況是T <: T)。

A <% B裝置A或者是一個的B亞型或存在從A於不同類型AA爲其AA <: B的隱式轉換。這被稱爲「視角」。

A >: B表示A是超類型B

+0

你說得對,沒有'<'約束。那麼'':'約束呢? –

+0

我剛開始閱讀實現'List'的章節。它解釋了在'List [Apple]'中添加一個'Orange'時'':''可以用來創建一個'List [水果]'。這是一個非常有趣的約束。 –

+0

更確切地說: A <%B表示存在從A到AA的明確類型AA的隱式轉換,其中AA <:B。如果A是B的子類型,則AA可以與A相同:函數(在Predef中定義並且始終在範圍中)可以應用而不是實際的轉換。 但即使A是B的子類型,也可能會隱式轉換爲優先於Predef.identity()的不同類型AA。在這種情況下,編譯器會推斷出類型AA。取決於implicits的優先級。 –