Почему scala WrappedArray [Int] (null, null) возвращает 0 при применении, что случилось? - PullRequest
0 голосов
/ 12 июня 2018

При работе в UDAF-функции sparkSql я обнаружил, что некоторые из моих входных столбцов неожиданно обнуляются с нуля до 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 голосов
/ 12 июня 2018

Вы вызвали метод 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]]

В вашем случае x - это Array(null, null), который является экземпляром Array[AnyRef], поэтому make создает и возвращает экземпляркласса ofRef[AnyRef], который объявлен как:

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.

...