我有一个隐式参数定义为:
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实例化隐式方法要求您在此实例中使用空参数调用对象?为什么会为此类对象实例显示隐式空白参数列表?
首先,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)
如果您没有范围内的编译器,编译器会让您知道它.这是好事.
但主要的是确保隐藏参数和隐式类之间的区别.
| 归档时间: |
|
| 查看次数: |
788 次 |
| 最近记录: |