我看到了一些例子,其中一個轉換函數T => S
作爲隱式參數傳遞。斯卡拉calls這個函數view
,甚至提供特殊的語法糖 - view bound
- 對於這種情況。關於Scala中視圖的問題
但是,我們已經有隱式轉換!我可以用隱式轉換替換這些views
(即轉換函數作爲隱式參數傳遞)嗎? ?我能做些什麼views
我不能用隱式轉換嗎?
我看到了一些例子,其中一個轉換函數T => S
作爲隱式參數傳遞。斯卡拉calls這個函數view
,甚至提供特殊的語法糖 - view bound
- 對於這種情況。關於Scala中視圖的問題
但是,我們已經有隱式轉換!我可以用隱式轉換替換這些views
(即轉換函數作爲隱式參數傳遞)嗎? ?我能做些什麼views
我不能用隱式轉換嗎?
我你的問題的理解是,會是什麼
case class Num(i: Int)
implicit def intToNum(i: Int) = Num(i)
def test[A <% Num](a: A): Int = a.i
test(33)
優於
def test2(a: Num): Int = a.i
test2(33)
是?那麼觀點的含義就是:T型可以被看作另一種類型S.你的方法或功能可能首先要處理T.一個例子是有序:
def sort[A <% Ordered[A]](x: A, y: A): (A, A) = if (x < y) (x, y) else (y, x)
sort(1, 2) // --> (1,2)
sort("B", "A") // --> (A,B)
兩個以上的用例圖界限:
你所說的隱式轉換隻不過是全局範圍內的一個視圖而已。
在使用類型參數時,必須使用視圖邊界,因爲這是一個需要隱式轉換的標誌。例如:
def max[T](a: T, b: T): T = if (a < b) b else a
因爲任何有關於T
沒有約束,編譯器不知道,<
方法可用。讓我們來看看編譯器讓你繼續與,然後再考慮這兩個調用:
max(1, 2)
max(true, false)
沒有什麼在告訴編譯器不應該允許第二個呼叫簽名max[T](a: T, b: T): T
,但應該允許第一。這是鑑於邊界進來:
def max[T <% Ordered[T]](a: T, b: T): T = if (a < b) b else a
,不僅講述在<
方法來自編譯器,但也告訴max(true, false)
是無效的編譯器。