什么时候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]的隐式范围内.

此外,最好指定含义类型;有时需要推断工作;有一天它将是必需的.

相关文章

共收录Twitter的14款开源软件,第1页Twitter的Emoji表情 Tw...
Java和Scala中关于==的区别Java:==比较两个变量本身的值,即...
本篇内容主要讲解“Scala怎么使用”,感兴趣的朋友不妨来看看...
这篇文章主要介绍“Scala是一种什么语言”,在日常操作中,相...
这篇文章主要介绍“Scala Trait怎么使用”,在日常操作中,相...
这篇文章主要介绍“Scala类型检查与模式匹配怎么使用”,在日...