如何解决避免模式匹配中的类型擦除
| 我正在尝试解决模式匹配中的类型擦除。假设: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] }
如何在没有警告和没有asInstanceOf
的情况下进行编译:
def test[V](os: OutputStream,v: V): Unit = v match {
case hs: HasSerializer[V] => hs.serializer.save(os,v)
case _ => ???
}
? a3ѭ是用映射中的值调用的,并且没有提供类清单的方法。
也许有任何奇特的提取技巧?
解决方法
如果可以使Serializer成为抽象类,则可以为它提供一个Manifest作为隐式构造函数参数,并使用它来获取构造时的具体类,然后将其用于动态类型检查。
import java.io._
abstract class Serializer[V: Manifest] {
def save(os: OutputStream,v: V): Unit
def load(in: InputStream): V
val clazz = manifest[V].erasure
}
val ser = new Serializer[Int] {
def save(os: OutputStream,v: Int) {
os.write((v.toString + \"\\n\").getBytes)
}
def load(in: InputStream) = {
val line = new BufferedReader(new InputStreamReader(in)).readLine()
line.toInt
}
}
ser.clazz // java.lang.Class[_] = int
,好了,这个问题有一个错误的前提条件(正如我刚刚意识到的那样)-我们可以将5分为串行器和反序列器。显然,当我有V
的实例时,我的用例是序列化,并且不需要V
作为返回类型。从而
trait Serializer { def save(os: OutputStream): Unit }
就足够了,任何类型都可以混入其中。
def testSer[V](os: OutputStream,v: V): Unit = v match {
case s: Serializer => s.save(os)
case _ => new ObjectOutputStream(os).writeObject(v)
}
对于反序列化,我们可以提供解串器以及Ref[V]
的构造,或者依赖通过ObjectInputStream
进行类查找。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。