0__*_*0__ 6 scala pattern-matching type-erasure
我试图在模式匹配中解决类型擦除问题.假设:
import java.io._
trait Serializer[V] {
def save(os: OutputStream, v: V): Unit
def load(in: InputStream): V
}
trait HasSerializer[V] { def serializer: Serializer[V] }
Run Code Online (Sandbox Code Playgroud)
我怎样才能在没有警告的情况下编译它而没有asInstanceOf:
def test[V](os: OutputStream, v: V): Unit = v match {
case hs: HasSerializer[V] => hs.serializer.save(os, v)
case _ => ???
}
Run Code Online (Sandbox Code Playgroud)
?test使用地图中的值调用,并且无法提供类清单.
任何花哨的提取器技巧可能吗?
好吧,这个问题有一个错误的前提条件(正如我刚刚意识到的那样)——我们可以将其分解Serializer为序列化器和反序列化器。显然,当我有 的实例时V,我的用例是序列化,并且不需要V作为返回类型。因此
trait Serializer { def save(os: OutputStream): Unit }
Run Code Online (Sandbox Code Playgroud)
就足够了,任何类型都可以混合它。并且执行以下操作:
def testSer[V](os: OutputStream, v: V): Unit = v match {
case s: Serializer => s.save(os)
case _ => new ObjectOutputStream(os).writeObject(v)
}
Run Code Online (Sandbox Code Playgroud)
对于反序列化,我们要么提供反序列化器以及 的构造Ref[V],要么依赖于通过 进行类查找ObjectInputStream。