绕过类型擦除:特征类型的问题!

时间:2011-03-16 11:36:17

标签: java scala lift

我希望使用here中的代码来匹配案例中的类型擦除:

 class Def[C](implicit desired: Manifest[C]) {

        def unapply[X](c: X)(implicit m: Manifest[X]): Option[C] = {
          def sameArgs = desired.typeArguments.zip(m.typeArguments).forall {
            case (desired, actual) => desired >:> actual
          }
          if (desired >:> m && sameArgs) Some(c.asInstanceOf[C])
          else None
        }
 }

此代码可用于匹配通常被删除的类型。例如:

val IntList = new Def[List[Int]]
List(1,2,3,4) match { case IntList(l) => l(1)   ; case _ => -1 }

而不是:

List(1,2,3,4) match { case l : List[Int] => l(1) ; case _ => -1}//Int is erased!

但是我遇到了Type系统的问题:

trait MyTrait[T]{
  type MyInt=Int
  val BoxOfInt=new Def[Some[MyInt]] // no problem
  type MyType = T
  val BoxOfMyType=new Def[Some[MyType]]// could not find....
}

该问题导致:

could not find implicit value for parameter desired: Manifest[Some[MyTrait.this.MyType]]
[INFO]   val BoxOfMyType=new Def[Some[MyType]]
[INFO]                   ^

如何在清单中获取所需的类型,或者如何更改代码以使其无错误或警告?

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

Manifest类型需要T。如果您声明一个类而不是一个特征,以下方法将起作用:

class MyTrait[T : Manifest]{
  type MyType = T
  val BoxOfMyType=new Def[Some[MyType]]
}

如果你确实需要一个特征而不是一个类,一种替代方法是要求所有子类以某种方式提供Manifest,例如:

trait MyTrait[T]{
  type MyType = T
  implicit val MyTypeManifest: Manifest[T]
  val BoxOfMyType=new Def[Some[MyType]]
}

class X extends MyTrait[Int] {
  val MyTypeManifest = manifest[Int]
}