NullPointerException关于隐式解析 [英] NullPointerException on implicit resolution
问题描述
此代码导致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")
}
隐藏隐式名称.
[视频] 在设计隐含性时我们犯了一些错误(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屋!