繁体   English   中英

Scala隐式类参数

[英]Scala implicit class parameter

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

 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 = Test@3bd40a57

我得到一个测试对象。

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

首先, Test 不是隐式类。 这个隐类的讨论。

相反, Test是一个没有显式构造函数自变量但只有一个implicit String变量的类。 这意味着您可以实例化Test的唯一方法是像您一样显式地提供隐式参数,这很尴尬并且无法实现目的,或者在实例化时在implicit作用域中提供一个且仅一个String并让编译器“选择它”。 “起来。

换句话说,如果您在范围内有以下内容:

implicit val s: String = "haha"

然后,您需要实例化Test是:

val grr = new Test

而且,如果您没有作用域,编译器会告知您。 这是好事。

但是,最主要的是确保您隐式参数和隐式类之间有所区别。

隐式空白参数列表仅适用于构造函数,并非适用于所有方法。 我认为这可能是因为解析器需要区分对类型Test(或同伴对象)的引用与对构造函数的引用。 如果它允许没有参数的构造函数,那么Test本身将是模棱两可的。

通常在scala中,当您引用“隐式类”时,您会像这样进行操作:

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

然后,您可以执行以下操作:

import Container._

它将隐式地将字符串转换为Test对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM