为什么scala WrappedArray [Int](null,null)在应用时返回0,发生了什么?

时间:2018-06-12 17:48:12

标签: scala apache-spark-sql user-defined-functions user-defined-aggregate

在使用sparkSql UDAF函数时,我发现我的一些输入列意外地从null变为0。

通过一些REPL练习,结果表明行为是scala 2.10.5。

代码捕捉如下:

import scala.collection.mutable

val wa = mutable.WrappedArray.make[Int](Array(null, null))

wa

wa(1)

请问有scala家庭帮忙解释为什么以及幕后发生的事情?

1 个答案:

答案 0 :(得分:1)

您调用了方法make[Int],其声明如下:

def make[T](x: AnyRef): WrappedArray[T] = (x match {
    case null              => null
    case x: Array[AnyRef]  => new ofRef[AnyRef](x)
    case x: Array[Int]     => new ofInt(x)
    case x: Array[Double]  => new ofDouble(x)
    case x: Array[Long]    => new ofLong(x)
    case x: Array[Float]   => new ofFloat(x)
    case x: Array[Char]    => new ofChar(x)
    case x: Array[Byte]    => new ofByte(x)
    case x: Array[Short]   => new ofShort(x)
    case x: Array[Boolean] => new ofBoolean(x)
    case x: Array[Unit]    => new ofUnit(x)
  }).asInstanceOf[WrappedArray[T]]

在您的情况下,xArray(null, null),它是Array[AnyRef]的实例,因此make创建并返回类ofRef[AnyRef]的实例,该实例声明为: / p>

final class ofRef[T <: AnyRef](val array: Array[T]) extends WrappedArray[T] with Serializable {
  lazy val elemTag = ClassTag[T](arrayElementClass(array.getClass))
  def length: Int = array.length
  def apply(index: Int): T = array(index).asInstanceOf[T]
  def update(index: Int, elem: T) { array(index) = elem }
}

当您致电wa(1)时,您调用此类的方法apply,因为您的第二个元素是null,它将返回0,因为null.asInstanceOf[Int]会返回0