微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

什么时候Scala可以隐式返回null?

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 举报,一经查实,本站将立刻删除。

相关推荐