我正在尝试将类型从超级类型java.io.Serializable强制类型转换为List [String]或List [List [String]]。我使用了asInstanceOf方法,如下所示,但类型仍为java.io.Serializable。
输入数据:
val singleList = "apple:orange"
val nestedList = "apple:orange;James:Mike"
val size = 8
功能:
def x(s:String): List[String] = {
s.split(":").toList
}
def s (s1: String) : List[ List[ String ]] = {
s1.split(";").toList.map(x=> x.split(":").toList)
}
val f = if(size <= 8) {
x(singleList).asInstanceOf[List[String]]
} else{
s(nestedList).asInstanceOf[List[List[String]]]
}
所需的输出类型:
列表[字符串]或列表[列表[字符串]]
谢谢
答案 0 :(得分:0)
很遗憾,“ List[String] or List[List[String]]
”不是有效的类型。您有以下选择:
Either[List[String], List[List[String]]]
中,f
归为List[_]
类型List[java.io.Serializable]
,然后使用它即可。您当然可以将or
定义为中缀运算符,它只是Either
的别名:
import util.{Either, Left, Right}
type or[A, B] = Either[A, B]
val f: List[String] or List[List[String]] = {
if (size <= 8) Left(x(singleList))
else Right(s(nestedList))
}
但是与直接使用Either
相比,它没有任何明显的优势。
如果您决定使用Either
/ or
,则随后的所有步骤也必须使用它。例如,以下是将f
设置为单行或多行表的方式:
def formatAsTable(t: List[String] or List[List[String]]): String = t match {
case Left(singleLine) => singleLine.mkString(",")
case Right(multiLine) => multiLine.map(_.mkString(",")).mkString("\n")
}
println(formatAsTable(f))
答案 1 :(得分:0)
您不能有条件地返回像这样的两种不同类型之一。考虑改用Either
:
val f: Either[List[String], List[List[String]]] = if (size <= 8) {
Left(x(singleList))
} else{
Right(s(nestedList))
}