使用asInstanceOf Scala进行类型转换后,类型错误

时间:2018-07-29 15:36:39

标签: 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]]]
      }

所需的输出类型:

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

谢谢

2 个答案:

答案 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))
}