避免模​​式匹配中的类型擦除

| 我正在尝试解决模式匹配中的类型擦除。假设:
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
进行类查找。     

要回复问题请先登录注册