繁体   English   中英

在Scala中将变量值用作类型

[英]Use variable value as a Type in Scala

我在玩序列化,从文件读回时遇到打字问题。

我当前的行动计划是使用文件名前缀来建议正确的类型,然后基于该类型进行反序列化。 (这很可能是一个“非常糟糕的主意”,因此不胜感激将收到所有建议!)

本质上,我想将一个对象写入文件,然后在以后的某个时刻将文件读回到正确类型的对象中。

以下是我想要使用的东西:

def readPatch(name:String): Patch = {
    // split name at tilde, prefix gives type
    val List(typeCode, filename) = List.fromString(name,'~')

    val patchClass = typeCode match {
        case "cfp" => CreateFilePatch.getClass
        case "dfp" => DeleteFilePatch.getClass
        case "cp" => ChangePatch.getClass
    }

    val inStream = new ObjectInputStream(new FileInputStream(filename))

    inStream.readObject().asInstanceOf[patchClass]
}

但我认为由于类型不是对象而无法实现。 尝试此代码时,出现错误“找不到:键入patchClass”。

有人可以提出建议吗?

作为一种快速的解决方法,您可以使用直接在match块中已经拥有的类型知识。

def readPatch(name:String): Option[Patch] = {
  val List(typeCode, filename) = List.fromString(name,'~')
  val inStream = new ObjectInputStream(new FileInputStream(filename))
  val obj      = inStream.readObject()

  typeCode match {
    case "cfp" => Some(obj.asInstanceOf[CreateFilePatch])
    case "dfp" => Some(obj.asInstanceOf[DeleteFilePatch])
    case "cp"  => Some(obj.asInstanceOf[ChangePatch])
    case _     => None
  }
}

尝试这个:

patchClass.cast(inStream.readObject())

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM