scala - 使用 asInstanceOf Scala 进行类型转换后的错误类型
问题描述
我正在尝试从超类型 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]]]
}
所需的输出类型:
列表 [字符串] 或列表 [列表 [字符串]]
谢谢
解决方案
不幸的是,“ 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))
推荐阅读
- python - Flask 分页,修改 request.args 或 request.form 参数并传递修改后的值以创建新的 URL
- javascript - 电子需求未定义
- anaconda - RuntimeError:CUDA 错误:没有可在设备上执行的内核映像
- python - python3 setup.py 安装失败(RHEL 8)
- excel - 在Excel VBA中双击执行宏
- javascript - 如何导入 ReactBootstrap 以在 react.js 中使用按钮
- java - 如何使用java检查aerospike数据库中是否存在bin?
- reactjs - React:图像源无效道具(源使用带有图像地址的字符串)
- google-chrome - 在 Chrome 中运行 javascript 后查看完整页面源代码(“查看生成的源代码”)?
- python - 响应[412]当使用requests python包访问该网页时,如何绕过?