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

无法将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)
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐