Scala的隐式类参数
我有一个隐含参数,一类定义为: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实例需要你在这个实例中调用带空参数的对象?为什么会出现这种对象实例的隐式空白参数列表?
首先,Test
是不是一个隐式类。有关隐式类的讨论,请参见this。
相反,Test
是一个没有显式构造函数参数但只有一个implicit String
参数的类。这意味着你可以实例化Test
的唯一方法是提供隐含的参数,如你所做的那样,这很尴尬并且失败了目的,或者在实例化时提供一个且仅有的implicit
范围,并让编译器“挑选它向上。”
换句话说,如果你有在范围上是这样的:
implicit val s: String = "haha"
然后你将不得不这样做实例Test
是这样的:
val grr = new Test
如果你不这样做有一个范围,编译器会让你知道它。这是好事。
但主要的是要确保你得到隐式参数和隐式类之间的区别。
隐式空白参数列表仅用于构造函数,并非全部方法。我认为这可能是因为解析器需要区分对类型Test(或伴随对象)的引用和对构造函数的引用。如果它允许一个没有参数的构造函数,那么Test本身就是不明确的。
通常在Scala中,当你提到一个“隐性类”你这样做是这样的:
object Container {
implicit class Test(val one: string)
}
然后,你可以这样做:
import Container._
,它会隐式将字符串转换为测试对象。
0123,但是我正在寻找封装一个隐式参数在一个类内给予某些范围内的类,而不是隐式地将字符串转换为测试类。我想我的例子有点做作。我想我有点困惑,你说测试将是模糊的,没有构造 - 是从模拟的对象测试,然后用类创建呢? – noname
对不起,是的,我应该使用正确的描述... – noname