带有参数化类型的 Scala 反射

标签 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))

有任何想法吗?

最佳答案

来自 ScalaDoc :“类型关系运算符 <:< 和 =:= 应仅被视为近似值,因为类型一致性的许多方面尚未在 list 中充分表示。”显然,这是一个这样的案例。

关于带有参数化类型的 Scala 反射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6755512/

相关文章:

java - Ignition.ignite 返回 "Grid instance was not properly started or was already stopped"

java - 无法在scala中使用java代码

scala - 为什么是 "avoid method overloading"?

scala - A safe way of 'overwriting'/'forcing' 某个隐式解析

scala - 带排序的参数化方法?

scala - .get(x)行为从何而来?

scala - SBT 是否排除了 JRebel?

scala - 如何处理 monix onErrorHandle 中抛出的未处理异常

scala - 如何递归地平衡括号

scala - 通过键写入多个输出 Scalding Hadoop,一个 MapReduce 作业