首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala -Scala unMkIdentity nullPointerException

Scala -Scala unMkIdentity nullPointerException
EN

Stack Overflow用户
提问于 2012-08-17 17:34:27
回答 1查看 76关注 0票数 1

我定义了以下类

代码语言:javascript
复制
private sealed trait Action2[-T1, +R] extends Function1[T1, R] {
   def printResults()
}

private abstract class BaseAction[T1, R] extends Action2[T1, R]{
  protected var result: R = null

  override final def apply(values: T1) : R = {
    result = evaluate(values)
    result
  }

  override final def printResults() {
    if(result == null)
      print("The results have not been evaluated!")
    else
      printLazyResults(result)
  }

  protected[this] def printLazyResults(results: R)
  protected[this] def evaluate(values: T1) : R
}

我有一个这个类的实现,每当我尝试实例化给定的实现时,方法:

代码语言:javascript
复制
 implicit def unMkIdentity[A](x: Identity[A]): A = x.value

抛出空指针异常。首先,我不明白为什么要调用它(我导入scalaz和Scalaz),以及为什么它从属性result中获取空值……

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-17 21:48:08

通常,像class X[R] { var r: R = null }这样的定义会给你带来麻烦

代码语言:javascript
复制
scala> class X[R] { var r: R = null }
<console>:7: error: type mismatch;
 found   : Null(null)
 required: A
       class X[R] { var r: R = null }

在这种情况下,发生了一些奇怪的事情,允许您的代码进行编译:编译器发现它在unMkIdentity中有一个隐式的Identity[R] => R,因此它将null解释为Identity[R]的一个实例,并尝试进行转换,这当然不起作用。

这不是故意的行为--这只是一个奇怪的小结果,因为周围有很多隐含的东西。

在任何情况下,您都不应该编写var r: R = null来初始化成员变量-您应该始终使用var r: R = _,它会选择一个合适的默认值。有关更多信息,请参阅the language specification的4.2节(“变量声明和定义”)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12003284

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档