我見過「<:」和「>:」和「<%」等,有人可以給(或定位)一個很好的描述這些?什麼是可能的約束,他們做了什麼以及什麼時候使用它們的例子?確定和描述斯卡拉的泛型類型約束
45
A
回答
67
S <: T
意味着S
是T
的子類型。這也被稱爲upper type bound。同樣,S >: T
表示S
是T
的超類型,lower type bound。
S <% T
是一個視圖綁定,並表示S
必須配備view將其值映射到T
類型的值。
這也讓我感到困惑,而且我有一個來自伯克利的編程語言碩士。
52
有兩種不同的東西在這裏,但他們都知道的「邊界」,而不是「限制」 ...
首先是類型範圍:
<:
- uppper類型綁定>:
- 結合型低
這些是基本相同super
和extends
在Java中,並實際上將在生成的字節碼,這是很好的互操作:)被編碼爲這樣
然後是語法糖:
<%
- 視圖綁定:
- 上下文界
這些在某種程度上的Java能瞭解(儘管它們是在斯卡拉簽名表示,一個註解,SC不被編碼ALA增加了所有課程,幫助編譯器,並最終將是一個斯卡拉反射庫的基礎)
上述這些問題都轉化爲隱性參數:
def fn[A <% B](arg: A) = ... //sugared
def fn[A](arg: A)(implicit ev: A => B) = ... //unsugared
def fn[A : Numeric](arg: A) = ... //sugared
def fn[A](arg: A)(implicit ev: Numeric[A]) = ... //unsugared
出於這個原因,你可以」 t將自己的隱含與視圖邊界或上下文邊界結合起來,因爲Scala只允許爲任何函數或構造函數標記爲隱式的一個塊。
如果您確實需要使用您自己的含義,那麼您必須首先手動將任何此類邊界轉換爲未加糖的版本並將其添加到隱式塊中。
相關問題
- 1. 斯卡拉 - 約束泛型類型特定類型
- 2. 泛型和類型約束的規則
- 3. Java的泛型斯卡拉
- 4. Delphi:泛型和類型約束
- 5. 斯卡拉瑟茜泛型
- 6. 斯卡拉依賴注入泛型類
- 7. 斯卡拉類型約束令人困惑的錯誤
- 8. 斯卡拉泛型和繼承
- 9. 類型約束中的泛型
- 10. 接口的泛型類型約束?
- 11. 類型約束的Swift泛型數組
- 12. C#泛型 - 約束的類型參數
- 13. 指定類型約束上的通用泛型類型
- 14. C#泛型和約束
- 15. 泛型類,約束和繼承
- 16. 反映了泛型類型約束
- 17. 斯卡拉地圖與泛型類以鍵/值類型
- 18. 在斯卡拉,是否有減少泛型類型的簡寫?
- 19. 類和方法層面的泛型類型約束作用
- 20. C#運行時將約束泛型類型轉換爲約束類型
- 21. 斯卡拉 - 從泛型類型構造方法名稱?
- 22. 確定型結構在斯卡拉
- 23. 泛型中的類型別名類型約束
- 24. 約束泛型類型參數的數值類型
- 25. 具有度量約束的泛型類
- 26. 斯卡拉類型參數
- 27. 使用類型[斯卡拉]
- 28. 斯卡拉動態類型
- 29. 斯卡拉類型問題
- 30. 如何指定.NET泛型約束中不允許的類型?
我喜歡這種解釋http://stackoverflow.com/questions/2982276/what-is-a-context-bound-in-scala/2983376#2983376 – huynhjl 2011-02-02 03:06:20
可能的重複[什麼是Scala上下文和視圖邊界?] (http://stackoverflow.com/questions/4465948/what-are-scala-context-and-view-bounds) – Suma 2015-04-29 12:55:10