Почему scala WrappedArray[Int](null,null) возвращает 0 при применении, что случилось?
Работая в функции sparkSql UDAF, я обнаружил, что некоторые из моих входных столбцов неожиданно обнуляются.
С некоторой практикой REPL выясняется, что поведение scala 2.10.5.
код, как показано ниже
import scala.collection.mutable
val wa = mutable.WrappedArray.make[Int](Array(null, null))
wa
wa(1)
Не могли бы вы порадовать кого-нибудь из семейства scala помочь объяснить, почему и что происходит за капотом?
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]]
В твоем случае 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
,