当
Scala的调用隐式在运行时返回null时,我最近感到很惊讶.我认为这是不可能的,因为如果在隐式范围内没有可用的隐式实例,则代码不应该编译.何时隐式允许返回null?这是编译器限制,还是这种预期的行为?
如果有帮助,这里有一些背景信息.我正在使用无形来派生类型类实例来持久化任意嵌套的case类.我认为在嵌套的case类中隐式使用来检查是否可以派生类型类实例是有帮助的,因为可能不清楚从哪里开始查看嵌套的case类是否很大.
所以,例如,如果我试图坚持:
case class Foo(bar: Bar,baz: Baz)
并且编译器无法为我的格式化程序MyFormatter [Foo]派生一个实例,我开始做类似以下的事情:
case class Bar(i: Int,q: Qux) object Bar { implicit val formatter = implicitly[MyFormatter[Bar]] }
期望编译器告诉我它无法找到MyFormatter [Bar]的隐式实例.
相反,这是一个可怕的想法,我的代码编译(当它不应该,因为没有Qux的类型类实例可以派生)和Bar.formatter在运行时为null.
解决方法
您的隐式定义是递归的.
scala> class C ; object C { implicit val cs: List[C] = implicitly[List[C]] } defined class C defined object C scala> C.cs res0: List[C] = null
cs不仅在范围内,而且对象C在List [C]的隐式范围内.
此外,最好指定含义类型;有时需要推断工作;有一天它将是必需的.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。