考慮以下REPL會話未發現:CanBuildFrom時隱式地調用
@ def test[C[X] <: TraversableOnce[X]](implicit cbf: CanBuildFrom[C[Int], Int, C[Int]]) = cbf()
defined function test
@ test[List]
res32: collection.mutable.Builder[Int, List[Int]] = ListBuffer()
@ def test[C[X] <: TraversableOnce[X]] = implicitly[CanBuildFrom[C[Int], Int, C[Int]]]
cmd33.sc:1: Cannot construct a collection of type C[Int] with elements of type Int based on a collection of type C[Int].
def test[C[X] <: TraversableOnce[X]] = implicitly[CanBuildFrom[C[Int], Int, C[Int]]]
^
Compilation Failed
test
函數的第一個定義編譯和作品,而第二個不能編譯。它們之間的唯一區別就是如何獲得CanBuildFrom
的實例。在第一種情況下,它被聲明爲隱式參數,要求編譯器找到一個參數。在第二種情況下,它通過implicitly
函數調用,理論上,它應該在隱式搜索範圍方面表現相同。什麼導致這種行爲?
但這兩種情況下的隱式作用域有什麼區別?正如我所說的,我在REPL中這樣做了,所以在第一種情況下,當我調用該函數時,找到了一個通用的'CanBuildFrom'(在Predef中,我想)。這意味着,範圍中有一個適當的'CanBuildFrom'隱式實例。爲什麼在REPL中定義獨立函數時不能使用同一個函數? – Haspemulator
在一種情況下,你有一個具體的類型,例如'List',在另一箇中有一個抽象類型參數'C [_]'。隱式解析將在類型類的同伴對象('CanBuildFrom')及其類型參數(例如'List' - 它找到類型類實例!)中尋找其他類型,但顯然無法解析抽象類型。 –
對,現在它是有道理的。 – Haspemulator