我見過「<:」和「>:」和「<%」等,有人可以給(或定位)一個很好的描述這些?什麼是可能的約束,他們做了什麼以及什麼時候使用它們的例子?確定和描述斯卡拉的泛型類型約束
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. 斯卡拉:有界泛型類型
- 4. 斯卡拉泛型:表示類型
- 5. 泛型和類型約束的規則
- 6. 具有泛型類型約束和繼承類型的泛型類定義?
- 7. 摘要泛型類的泛型約束
- 8. Java的泛型斯卡拉
- 9. Ninject - 約束綁定泛型類型
- 10. Delphi:泛型和類型約束
- 11. 斯卡拉泛型this.type
- 12. 斯卡拉瑟茜泛型
- 13. 斯卡拉泛型發出
- 14. 斯卡拉依賴注入泛型類
- 15. 斯卡拉類型約束令人困惑的錯誤
- 16. 斯卡拉泛型和繼承
- 17. 斯卡拉泛型和類型不匹配
- 18. C#泛型 - 約束的類型參數
- 19. 泛型類型參數的約束
- 20. 類型約束的Swift泛型數組
- 21. 接口的泛型類型約束?
- 22. 類型約束中的泛型
- 23. 指定類型約束上的通用泛型類型
- 24. 斯卡拉類型約束不允許空
- 25. C#泛型和約束
- 26. 泛型類,約束和繼承
- 27. 泛型類和約束條件
- 28. Autofac約定泛型類型
- 29. 反映了泛型類型約束
- 30. 泛型類型約束上還是
我喜歡這種解釋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