NullPointerException关于隐式解析 [英] NullPointerException on implicit resolution

查看:152
本文介绍了NullPointerException关于隐式解析的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

此代码导致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.但是如何将其解析为现场本身呢?

解决方案

尝试

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

隐藏隐式名称.

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

如何从Scala取消隐式导入重复吗?

Scala隐式def不如果def名称为toString

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

This code results in 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")
}

Stack trace:

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)

Why does Scala resolves implicit parameter for function aMyContext to itself:

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

Yes, aMyContext gets implicit Context and for MyContext there's an implicit conversion to Context. But how can it resolve it to the field itself?

解决方案

Try

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

hiding the name of implicit.

Caching the circe implicitly resolved Encoder/Decoder instances

How can an implicit be unimported from the Scala repl?

Scala implicit def do not work if the def name is toString

[video] Some Mistakes We Made When Designing Implicits (11:18)

这篇关于NullPointerException关于隐式解析的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆