scala - 如何使用 Scala 2.10 反射 API 检查运行时实例是否符合某种类型?

标签 scala reflection

以下代码段按预期返回 true:

import scala.reflect.runtime.universe._
typeOf[Seq[Int]] <:< typeOf[Traversable[Int]]

但是这个片段没有:

val s = Seq[Int](1,2,3)
val m = runtimeMirror(this.getClass.getClassLoader)
val t = m.reflect(s).symbol.typeSignature
t <:< typeOf[Seq[Int]]

我确定我只是遗漏了一些明显的东西,但我已经使用 REPL 几个小时了,但还没有解决。任何建议将不胜感激。提前致谢。

最佳答案

1) typeOf[...] 保留了 Java 删除中的确切 Scala 类型,但是,obj.getClass(因此 m.reflect(obj ),它在幕后使用了 getClass) 没有。因此,最好的运行时反射可以通过反射 s 而无需额外的编译时间努力是 Seq[_] (这将无法通过子类型测试)。如果您需要在运行时记住某些东西的确切 Scala 类型,请使用类型标签(就像 typeOf 一样)或宏(就像类型标签一样)。

2) .symbol.typeSignature 不会起作用,因为那是 ClassInfoType(即一种类型,它封装了类类型的父类和成员列表).类信息类型非常适合检查成员(可能也适用于基类,也可能适用于其他一些东西,但我不确定),但对其他一切就不是那么好。你想要像 .symbol.asType.toType 这样的东西,它会返回一个 TypeRef(即在我们的例子中 scala.collection.immutable.: : - 注意这里没有任何类型参数!)。不幸的是,由于 #1 中所述的删除,这仍然无法开箱即用。

关于scala - 如何使用 Scala 2.10 反射 API 检查运行时实例是否符合某种类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16003620/

相关文章:

multithreading - Scala中对象级别的Val和线程安全

c++ - 在一系列成员变量上调用运算符

c# - 从 lambda 表达式访问属性的 HtmlHelper 方法之间的区别

java - 我应该如何根据用户选择来选择实例化哪个具体实现?

scala - 通过反射获取 `Symbol` 的方法参数

scala - Lift 和 Lifty 入门

scala - 在不输入 amm 的情况下运行 Ammonite scala 脚本

java - Scala 中的贝叶斯网络

generics - Scala 类型构造函数的误解

java - Class.isAssignableFrom 在某些情况下会给出错误的结果