NullPointerException关于隐式解析

德米特里·科马诺夫(Dmitry Komanov)

这段代码导致NullPointerException:

import anotherpackage.MyContext
import anotherpackage.builders.aMyContext

case class Context(id: String)
object Context {
  implicit def `ContextHolder to Context`(implicit holder: ContextHolder): Context = holder.context
}
trait ContextHolder {
  def context: Context
}

object anotherpackage {
  case class MyContext(name: String, context: Context) extends ContextHolder

  object builders {
    def aMyContext(name: String)(implicit context: Context = Context("test")): MyContext =
      MyContext(name, context)
  }
}

object SimpleDemo extends App {
  implicit val myContext: MyContext = aMyContext("name")
}

堆栈跟踪:

Exception in thread "main" java.lang.NullPointerException
    at Context$.ContextHolder$u0020to$u0020Context(SimpleDemo.scala:8)
    at SimpleDemo$.delayedEndpoint$SimpleDemo$1(SimpleDemo.scala:24)
    at SimpleDemo$delayedInit$body.apply(SimpleDemo.scala:23)
    at scala.Function0.apply$mcV$sp(Function0.scala:39)
    at scala.Function0.apply$mcV$sp$(Function0.scala:39)
    at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:17)
    at scala.App.$anonfun$main$1$adapted(App.scala:80)
    at scala.collection.immutable.List.foreach(List.scala:392)
    at scala.App.main(App.scala:80)
    at scala.App.main$(App.scala:78)
    at SimpleDemo$.main(SimpleDemo.scala:23)
    at SimpleDemo.main(SimpleDemo.scala)

为什么Scala会将函数的隐式参数解析aMyContext为自身:

implicit val myContext: MyContext = aMyContext("name")

是的,aMyContext获取隐式上下文,对于MyContext,有一个隐式转换为Context。但是如何解决它本身的领域呢?

米米(Dmytro Mitin)

尝试

implicit val myContext: MyContext = {
  val myContext = null
  aMyContext("name")
}

隐藏隐式名称。

缓存循环隐式解析的Encoder / Decoder实例

如何从Scala复制副本中取消隐式导入?

如果def名称为toString,则Scala隐式def不起作用

[视频]我们在设计内隐时犯了一些错误(11:18)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章