【问题标题】:Scala: Casting and AssignmentScala:铸造和分配
【发布时间】:2017-09-13 03:23:36
【问题描述】:

在 Scala/Spark 数据帧中

    dfReduced.schema.fieldNames 

是一个 java 字符串数组 (String[])。然而,

    dfReduced.schema.fieldNames.asInstanceOf[Seq[String]]

抛出

java.lang.ClassCastException: [Ljava.lang.String;不能转换为 scala.collection.Seq

将相同的数组分配给 Seq[String] 很好。

   val f3:Seq[String]=dfReduced.schema.fieldNames

作为一名 Java 程序员,这让我感到惊讶,因为两者都需要在 Java 中进行转换。有人可以解释为什么 Scala 有这种区别

(注意,我不是在批评,我只是想更好地理解 Scala)

【问题讨论】:

  • 区别在于run-time 类型转换与compile-time 类型归属。您可能会对这个 StackOverflow link 感兴趣。

标签: scala apache-spark schema


【解决方案1】:

val f3:Seq[String]=dfReduced.schema.fieldNames 工作的原因是因为在 Scala 中存在隐式转换,而不是可以将 Array[T] 隐式转换为 Seq[T]

在 Java 中没有这种类型的隐式转换可用。

正如Leo C 在评论The difference is run-time type cast versus compile-time type ascription 中提到的那样。更多信息可以参考link

希望这能解决你的问题

谢谢

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-01
    • 2015-04-06
    • 2010-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多