首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >绕过类型擦除:特征类型问题!

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

Stack Overflow用户
提问于 2011-03-16 19:36:17
回答 1查看 286关注 0票数 2

我想使用here中的代码解决大小写匹配时的类型擦除问题

代码语言:javascript
复制
 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
        }
 }

这段代码我可以用来匹配那些通常被擦除的类型。示例:

代码语言:javascript
复制
val IntList = new Def[List[Int]]
List(1,2,3,4) match { case IntList(l) => l(1)   ; case _ => -1 }

而不是:

代码语言:javascript
复制
List(1,2,3,4) match { case l : List[Int] => l(1) ; case _ => -1}//Int is erased!

但是我有一个关于Type系统的问题:

代码语言:javascript
复制
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....
}

这个问题会导致:

代码语言:javascript
复制
could not find implicit value for parameter desired: Manifest[Some[MyTrait.this.MyType]]
[INFO]   val BoxOfMyType=new Def[Some[MyType]]
[INFO]                   ^

如何将所需的类型放入清单中,或者如何更改代码以使其正常工作而不出现错误或警告?!

谢谢你的帮助

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-03-16 21:07:17

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

代码语言:javascript
复制
class MyTrait[T : Manifest]{
  type MyType = T
  val BoxOfMyType=new Def[Some[MyType]]
}

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

代码语言:javascript
复制
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]
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5324665

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档