[英]Scala reflection with parameterized types
我编写了以下 function 来检查给定的 singleton class 是否实现了特征。
/** 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))
有任何想法吗?
来自ScalaDoc :“类型关系运算符 <:< 和 =:= 应仅视为近似值,因为类型一致性的许多方面尚未在清单中充分表示。” 显然,这是一个这样的案例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.