Java-класс byte[]
является синонимом Array[Byte]
, поэтому, если вы встретите класс с именем "[B"
, можно просто получить класс напрямую classOf[Array[Byte]]
, поскольку он является примитивом языка.
if ( name == "[B" )
c = classOf[Array[Byte]]
К сожалению, все сложнее, чем это.Есть больше примитивов массива Java, которые также должны быть обработаны.Посмотрите, как названы следующие классы.
println( classOf[Array[Boolean]].getName ) // "[Z"
println( classOf[Array[Byte]].getName ) // "[B"
println( classOf[Array[Char]].getName ) // "[C"
println( classOf[Array[Int]].getName ) // "[I"
println( classOf[Array[Long]].getName ) // "[J"
println( classOf[Array[Double]].getName ) // "[D"
println( classOf[Array[Float]].getName ) // "[F"
println( classOf[Array[String]].getName ) // "[Ljava.lang.String;"
println( classOf[Array[Any]].getName ) // "[Ljava.lang.Object;"
println( classOf[Array[Option[Any]]].getName ) // "[Lscala.Option;"
Обратите внимание на стирание типа в последнем.А также необходимо обрабатывать вложенные массивы.
println( classOf[Array[Array[Boolean]]].getName ) // "[[Z"
println( classOf[Array[Array[Array[Boolean]]]].getName ) // "[[[Z"
println( classOf[Array[Array[Option[_]]]].getName ) // "[[Lscala.Option;"
println( classOf[Array[Array[Array[Option[_]]]]].getName ) // "[[[Lscala.Option;"