【问题标题】:Implicit conversions and implicit classes隐式转换和隐式类
【发布时间】:2016-11-18 16:42:35
【问题描述】:

我编写了以下非常简单的程序,我希望它可以正常工作:

object Main {

  def main(args: Array[String]) = {
    val mc1: MyClass = new MyClass(20);
    val mc2: MyClass = 10
    mc1.doSome //fine
    mc2.doSome //fine
    30.doSome //error. Cannot resolve symbol doSome
  }

  implicit def int2MyClass(i: Int): MyClass = new MyClass(i)

  implicit class Tst(val mc: MyClass){
    def doSome = println(mc.i)
  }
}

class MyClass(val i: Int)

DEMO

但不幸的是,它没有。该错误是由于隐式转换未能将30 转换为MyClass(30) 引起的。为什么?这有什么问题?

【问题讨论】:

  • 在使用前声明隐式,如果在同一个文件中
  • 仅供参考,它通过将 30.doSome 更改为 (30: MyClass).doSome 进行编译。我不知道为什么!除非您明确指定类型,否则编译器似乎只应用一次隐式。
  • 正如@IdanWaisman 所指出的,Scala 不允许堆叠/链接隐式。从设计上讲,它是一种一次性的机制。

标签: scala implicit-conversion implicit


【解决方案1】:

当您执行30.doSome 时,Scala 编译器会在Int 中查找方法,如果未找到,则会在Int 上查找implicit class 声明。但不幸的是,implicit class 是在 myClass 上声明的。

为了让它工作,用显式类型帮助编译器

(30: MyClass).doSome

【讨论】:

    【解决方案2】:

    我怀疑this 可能是问题所在。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-04
      相关资源
      最近更新 更多