Scala隐式类参数

non*_*ame 2 java scala

我有一个隐式参数定义为:

 class Test(implicit one: String)
Run Code Online (Sandbox Code Playgroud)

我想像这样实例化该对象:

val grr = new Test("aha")
Run Code Online (Sandbox Code Playgroud)

我得到以下异常.

error: too many arguments for constructor Test: ()(implicit one: String)Test
       val grr = new Test("aha")
Run Code Online (Sandbox Code Playgroud)

但如果我这样称呼它

val grr = new Test()("haha")
grr: Test = Test@3bd40a57
Run Code Online (Sandbox Code Playgroud)

我得到一个Test对象.

为什么Scala实例化隐式方法要求您在此实例中使用空参数调用对象?为什么会为此类对象实例显示隐式空白参数列表?

Vid*_*dya 5

首先,Test不是一个隐含的类.见这个隐类的讨论.

相反,Test是一个没有显式构造函数参数但只有一个implicit String参数的类.这意味着你可以实例化的唯一方法Test就是像你一样明确地提供隐式参数,这很尴尬并且无法实现目的,或者在实例化时提供范围内的一个且只有一个String,implicit并让编译器"捡起它".

换句话说,如果你在范围内有类似的东西:

implicit val s: String = "haha"
Run Code Online (Sandbox Code Playgroud)

那么你需要做的就是实例化Test:

val grr = new Test
Run Code Online (Sandbox Code Playgroud)

如果您没有范围内的编译器,编译器会让您知道它.这是好事.

但主要的是确保隐藏参数和隐式类之间的区别.