2017-03-07 113 views
1

我有一個隱含參數,一類定義爲:Scala的隱式類參數

class Test(implicit one: String) 

而且我要來實例化對象,像這樣:

val grr = new Test("aha") 

我得到下面的異常。

error: too many arguments for constructor Test:()(implicit one: String)Test 
     val grr = new Test("aha") 

但如果我把它像這樣

val grr = new Test()("haha") 
grr: Test = [email protected] 

我得到一個測試對象。

爲什麼隱式方法的Scala實例需要你在這個實例中調用帶空參數的對象?爲什麼會出現這種對象實例的隱式空白參數列表?

回答

5

首先,Test不是一個隱式類。有關隱式類的討論,請參見this

相反,Test是一個沒有顯式構造函數參數但只有一個implicit String參數的類。這意味着你可以實例化Test的唯一方法是提供隱含的參數,如你所做的那樣,這很尷尬並且失敗了目的,或者在實例化時提供一個且僅有的implicit範圍,並讓編譯器「挑選它向上。」

換句話說,如果你有在範圍上是這樣的:

implicit val s: String = "haha" 

然後你將不得不這樣做實例Test是這樣的:

val grr = new Test 

如果你不這樣做有一個範圍,編譯器會讓你知道它。這是好事。

但主要的是要確保你得到隱式參數和隱式類之間的區別。

+0

對不起,是的,我應該使用正確的描述... – noname

0

隱式空白參數列表僅用於構造函數,並非全部方法。我認爲這可能是因爲解析器需要區分對類型Test(或伴隨對象)的引用和對構造函數的引用。如果它允許一個沒有參數的構造函數,那麼Test本身就是不明確的。

通常在Scala中,當你提到一個「隱性類」你這樣做是這樣的:

object Container { 
    implicit class Test(val one: string) 
} 

然後,你可以這樣做:

import Container._ 

,它會隱式將字符串轉換爲測試對象。

+0

0123,但是我正在尋找封裝一個隱式參數在一個類內給予某些範圍內的類,而不是隱式地將字符串轉換爲測試類。我想我的例子有點做作。我想我有點困惑,你說測試將是模糊的,沒有構造 - 是從模擬的對象測試,然後用類創建呢? – noname