【问题标题】:Scala implicit class parameterScala 隐式类参数
【发布时间】:2017-03-07 19:54:16
【问题描述】:

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

 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实例化隐式方法需要你在这个实例中调用带有空白参数的对象?为什么会为此类对象实例提供一个隐含的空白参数列表?

【问题讨论】:

    标签: java scala


    【解决方案1】:

    首先,Test 不是一个隐式类。有关隐式类的讨论,请参阅 this

    相反,Test 是一个没有显式构造函数参数但有一个 implicit String 参数的类。这意味着您可以实例化 Test 的唯一方法是像您所做的那样显式提供隐式参数,这很尴尬并且违背了目的,或者在实例化时在 implicit 范围内提供一个且仅一个 String 和让编译器“捡起它”。

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

    implicit val s: String = "haha"
    

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

    val grr = new Test
    

    如果你没有在范围内,编译器会让你知道它。这是一件好事。

    不过,最重要的是确保您能区分隐式参数和隐式类。

    【讨论】:

      【解决方案2】:

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

      通常在 scala 中,当您引用“隐式类”时,您会这样做:

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

      那么你可以这样做:

      import Container._
      

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

      【讨论】:

      • 对,但我希望在类中封装一个隐式参数,以便在特定范围内将其提供给类,而不是将字符串隐式转换为测试类。我想我的例子有点做作。我想我有点困惑你说没有构造函数的测试会模棱两可 - 那是从用类创建的对象 Test 模棱两可吗?
      猜你喜欢
      • 2011-08-29
      • 1970-01-01
      • 1970-01-01
      • 2018-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-19
      相关资源
      最近更新 更多