首页 > 解决方案 > 使用 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]]]
      }

所需的输出类型:

列表 [字符串] 或列表 [列表 [字符串]]

谢谢

标签: scala

解决方案


不幸的是,“ 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))

推荐阅读