无法将PartialFunction放在scala类构造函数中

似乎存在一个限制,即您不能在类构造函数中使用PartialFunction文字

scala> case class X(a: PartialFunction[Any,Any]) { def this() = this({case x => x}) }
<console>:7: error: Implementation restriction: <$anon: Any => Any> requires premature access to class X.
   case class X(a: PartialFunction[Any,Any]) { def this() = this({ case x => x}) }

我的第一个问题是为什么部分函数文字需要访问“this”.我的第二个问题/观察是在Scala REPL中,再次运行相同的代码会导致REPL崩溃:

scala> case class X(a: PartialFunction[Any,Any]) { def this() = this({ case x => x}) }
java.lang.NullPointerException
    at scala.tools.nsc.Global$Run.compileLate(Global.scala:1595)
    at scala.tools.nsc.GlobalSymbolLoaders.compileLate(GlobalSymbolLoaders.scala:29)
    at scala.tools.nsc.symtab.SymbolLoaders$SourcefileLoader.doComplete(SymbolLoaders.scala:369)
    ...

最后,这个问题有一个很好的解决方法吗?

解决方法

你的第一个问题是 in the comment section of this question回答

引用Imm:

Anonymous classes have access to their enclosing class. The compiler doesn’t kNow that your anonymous partial function doesn’t actually access anything (and it would be very hard to check this in full generality); it simply disallows creating any anonymous classes until you’re into the class proper.

为什么它崩溃REPL是一个很好的问题,您应该使用此代码示例提交一个Typesafe的票证.

解决方法非常简单,只需在类外部定义匿名函数,以便编译器知道您要关闭的确切状态:

object X {
  val Default: PartialFunction[Any,Any] = { case x => x }
}

case class X(a: PartialFunction[Any,Any]) {
  def this() = this(X.Default)
}

相关文章

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