带有参数化类型的Scala反射
我编写了以下函数来检查给定的singleton类是否实现了trait带有参数化类型的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
/** 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不是因为抛出异常,而是因为清单检查。我想知道这是否是由于擦除?我的理解是,参数化不应该在编译后继续存在——也就是说,不可能用反省的眼光看他们,可能是错的。