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 

如果你不这样做有一个范围,编译器会让你知道它。这是好事。

但主要的是要确保你得到隐式参数和隐式类之间的区别。

+0

对不起,是的,我应该使用正确的描述... – noname

隐式空白参数列表仅用于构造函数,并非全部方法。我认为这可能是因为解析器需要区分对类型Test(或伴随对象)的引用和对构造函数的引用。如果它允许一个没有参数的构造函数,那么Test本身就是不明确的。

通常在Scala中,当你提到一个“隐性类”你这样做是这样的:

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

然后,你可以这样做:

import Container._ 

,它会隐式将字符串转换为测试对象。

+0

0123,但是我正在寻找封装一个隐式参数在一个类内给予某些范围内的类,而不是隐式地将字符串转换为测试类。我想我的例子有点做作。我想我有点困惑,你说测试将是模糊的,没有构造 - 是从模拟的对象测试,然后用类创建呢? – noname