带有参数化类型的Scala反射

带有参数化类型的Scala反射,scala,Scala,我编写了以下函数来检查给定的singleton类是否实现了trait /** Given a singleton class, returns singleton object if cls implements T. * Else returns None. */ def maybeMakeSingletonObj[T: ClassManifest](cls: Class[_]): Optio

我编写了以下函数来检查给定的singleton类是否实现了trait

/** 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))

有什么想法吗?

From:“类型关系运算符如果您能描述故障,或者至少包含自包含的代码,它会有所帮助。代码是自包含的。故障只是因为makeSingletonObj没有返回一些(B)在第二种情况下,它返回None。清单检查不像在第一种情况下那样工作。此外,它返回None不是因为抛出异常,而是因为清单检查。我想知道这是否是由于擦除?我的理解是,参数化不应该在编译后继续存在——也就是说,不可能用反省的眼光看他们,可能是错的。