在scala中将字符串转换为参数化类型

时间:2019-03-01 09:50:25

标签: scala casting

我正在尝试通过使用asInstanceof方法将字符串转换为scala type,同时执行此操作时出现以下异常 java.lang.ClassCastException: java.lang.String cannot be cast to scala.Tuple2

我的代码如下

import org.apache.spark.sql.Column
import org.apache.spark.sql.functions.col
val cond : String = "(null, col(field).isNotNull)"  // Will get this condition from properties file.
type mutliColumnType = (Column, Column)

def condition( value : String , field : String = "somefield") : mutliColumnType = {
value match {
   case "a" => (null, col(field).isNull) 
   case _ => convertStringToMutliColumnType(cond) //cond.asInstanceOf[mutliColumnType]  
  }
}

condition("a") // returns data
condition("ab") // Exception 

我们如何在这里将字符串转换为multiColumnType

更新:

目前,我在下面的代码段中编写了将字符串解析为mutliColumnType的信息:

def convertStringToMutliColumnType(cond : String) : mutliColumnType = {
    val colArray=cond.trim.substring(1, cond.length-1).split(",")
    (col(colArray(0)), col(colArray(1)))
}

1 个答案:

答案 0 :(得分:3)

您似乎想要asInstanceOf将字符串评估为Scala代码。这与“ casting”实际上不是一回事,它不是asInstanceOf所做的,并且实际上,将字符串作为代码来评估字符串并不是Scala所支持的(除了一些内部API和不建议使用的库,例如现在已经不存在的twitter-util-eval)。

目前还不清楚您要在这里做什么,但是您的选择基本上是编写一个接受字符串并返回mutliColumnType值的解析器(这是很多工作,几乎可以肯定是个坏主意) ,或者只是不这样做-即在需要Scala代码的地方使用Scala代码,在需要字符串的地方使用字符串。

作为脚注:asInstanceOf仅对向下转换非常有用(当您丢失类型信息并且键入了Any时,您作为程序员“知道”的实际上是一个{{1 }}或其他任何东西,即使这样,它仍应被视为不安全且通常不是惯用的高级技术。每当您编写String时,都是在告诉编译器,因为您了解得更多,所以请避开它们。以我的经验,您通常会出错。