带参数化类型的Scala反射

时间:2011-07-19 23:53:19

标签: scala

我编写了以下函数来检查给定的单例类是否实现了特征。

/** Given a singleton class, returns singleton object if cls implements T.                                                 
 * Else returns None. */
 def maybeMakeSingletonObj[T: ClassManifest](cls: Class[_]): Option[T] = {
   try {
     val m = classManifest[T]
     val obj = cls.getField("MODULE$").get(m.erasure).asInstanceOf[AnyRef]

     if (Manifest.singleType(obj) <:< m) Some(obj.asInstanceOf[T])
     else None
   } catch {
     case e: Exception => None
   }
 }

此代码适用于以下示例:

trait A
object B extends A

assert(maybeMakeSingletonObj[A](B.getClass()) === Some(B)) 

但是,在以下示例中失败:

trait A[T, R]
object B extends A[Int, Int]

assert(maybeMakeSingletonObj[A[_,_]](B.getClass()) === Some(B))

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

来自ScalaDoc:“类型关系运算符&lt;:&lt;和=:=应仅被视为近似值,因为类型一致性的许多方面尚未在清单中充分表示。”显然,就是这种情况。