【问题标题】:How to import an implicit object?如何导入隐式对象?
【发布时间】:2016-06-23 21:18:21
【问题描述】:

也许这是一个愚蠢的问题,但编译以下给出error: could not find implicit value for evidence parameter of type Outer.Inner.MyImplicit[Int]

object Outer {
  import Inner._

  def someMethod[T : MyImplicit] = {}
  someMethod[Int]

  object Inner {
    sealed trait MyImplicit[T]
    implicit case object IntImplicit extends MyImplicit[Int]
  }
}

为什么尽管导入了Outer 对象却看不到IntImplicit?有没有办法让编译器在Inner 对象中找到IntImplicit

更新:如果我取消嵌套 Inner 会怎样——那我将如何导入它?

object Outer {
  import Other._
  def someMethod[T : MyImplicit] = {}
  someMethod[Int]
}

object Other {
  sealed trait MyImplicit[T]
  implicit case object IntImplicit extends MyImplicit[Int]
}

谢谢。

【问题讨论】:

    标签: scala scala-2.11


    【解决方案1】:

    在导入之前定义对象 Inner。所以,这很好用。

    object Outer {
      object Inner {
        sealed trait MyImplicit[T]
        implicit case object IntImplicit extends MyImplicit[Int]
      }
      import Inner._
    
      def someMethod[T : MyImplicit] = {}
      someMethod[Int]
    }
    

    【讨论】:

    • @Sergey 知道如果我有一个单独的(非嵌套)对象我会怎么做吗? (查看更新)
    • 我要补充一点,当您有明确的签名时,顺序无关紧要:implicit val IntImplicit: MyImpicit[Int] = new MyImplicit[Int] {}。但是没有办法在case object上放一个。
    • 对于更新:同样,如果它们在一个文件中,Other 必须在 Outer 之前 具有 IntImplicit 的确切返回类型。否则Other 还没有经过类型检查,所以编译器还没有发现IntImplicitMyImplicit[Int]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-09
    • 2018-06-26
    • 2014-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多