【发布时间】:2020-10-21 15:53:26
【问题描述】:
我正在使用 ADT 和 Aux-pattern 设计类型安全代码,并且无法摆脱一些 asInstanceOf。示例如下:
sealed trait Source
case object FileSystem extends Source
case object Network extends Source
sealed trait Data {
type S <: Source
}
object Data {
type Aux[T <: Source] = Data { type S = T }
}
case class RegularFile(path: String) extends Data { type S = FileSystem.type }
case class Directory(path: String) extends Data { type S = FileSystem.type }
case class UnixDevice(path: String) extends Data { type S = FileSystem.type }
case class Remote(ip: String) extends Data { type S = Network.type }
//Lots of asInstanceOf
def availableData[S <: Source](src: Source): List[Data.Aux[S]] = {
src match {
case FileSystem => List(
RegularFile("/tmp/test").asInstanceOf[Data.Aux[S]],
Directory("/home/somename").asInstanceOf[Data.Aux[S]],
UnixDevice("/dev/null").asInstanceOf[Data.Aux[S]],
)
case Network => List(
Remote("192.168.0.1").asInstanceOf[Data.Aux[S]]
)
}
}
在这种情况下,很明显asInstanceOf 是正确的,但是有没有办法得到它?
我正在考虑S <: Source: ClassTag,但它在这里似乎没有用。也许其他反射技巧?
【问题讨论】:
-
typeclass 方法怎么样:scastie.scala-lang.org/BalmungSan/eAxdK9LIROa4Jv5JXB5BSQ/9
标签: scala type-safety algebraic-data-types