Преобразование неизвестного тега класса в Float в Scala - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть переменная с именем data.Эти данные имеют тип Array[ED].Теперь во время выполнения тип ED может быть либо Integer, либо Double.Я хотел преобразовать этот массив в массив Array[Float].Я пробовал data.map(x => x.asInstanceOf[Float].floatValue), но, к сожалению, он возвращает исключение ClassCastException.Я хочу знать, каков правильный подход для преобразования этого массива?

Ответы [ 3 ]

0 голосов
/ 04 декабря 2018

Вы можете преобразовать этот неизвестный тип в Number, так как Number является суперклассом для всех числовых классов.

  def convertToFloat[T](arr: Array[T]): Array[Float] = {
    arr.map(_.asInstanceOf[Number].floatValue())
  }

  def main(args: Array[String]): Unit = {
    println(convertToFloat(Array(1.234456335664756746, 2.324902485349859)).mkString(", "))
    println(convertToFloat(Array(1, 2, 3)).mkString(", "))
  }

Вывод:

1.2344563, 2.3249025

1,0, 2,0, 3,0

0 голосов
/ 04 декабря 2018

Вы можете использовать collect, чтобы получить значения в Array:

data.collect{ case n: Number => n.floatValue }

Это пропустит любые нечисловые значения, поэтому добавьте case _, если вы хотите проверить это.

Я бы также рекомендовал использовать нативные типы Scala, такие как List и Vector, а не Array, которые являются просто оболочкой для массива Java и не очень хорошо подходят для системы типов Scala..


Обратите внимание, что Number довольно неудобно, потому что это тип Java и на самом деле не входит в иерархию типов Scala.Если вы хотите избежать этого, это также работает:

data.map(_.toString.toFloat)
0 голосов
/ 04 декабря 2018

Любое значение Numeric может быть преобразовано в значение Float.

def toFloat[N](n :N)(implicit ev :Numeric[N]) :Float =
  ev.toDouble(n).floatValue()

toFloat(9)     //res0: Float = 9.0
toFloat(9.2D)  //res1: Float = 9.2

Но если компилятор не распознает ваш тип ED как Numeric, то это не таксобираюсь помочь.

...