问题标签 [scala-reflect]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
scala - 从 TypeTag[T] 获取伴随对象的字段值
我有一个非常罕见的用例,其中第 3 方正在实施特征(想想插件架构),我想获得每个特征的伴随对象的字段。
一个简单的 trait 实现如下所示:
在插件注册表中 - 我想获取ID
每个插件的。由于我们正在处理类型擦除 - 反射似乎是我唯一的选择。我尝试了以下方法无济于事:
但这里的问题是它typeOf[T]
总是返回 Class 类型而不是 Module 类型 - 因此我得到以下运行时错误:
ID
从每个插件中获取价值的最佳方法是什么TypeTag
?
scala - 在宏中从 Scala TypeTag 中获取 Java 类
根据这个问题/答案任何方式从 Scala (2.10) 类型标记或符号中获取 Java 类?
我应该用来从一个类型runtimeClass
中获取。Class
但是,如果我在宏中进行反射,我将无法访问runtimeClass
. 我能怎么做?
scala - Scala:反射和案例类
下面的代码成功了,但是有没有更好的方法来做同样的事情?也许是特定于案例类的东西?在下面的代码中,对于我的简单案例类中的每个 String 类型的字段,代码会遍历该案例类的实例列表并找到该字段的最长字符串的长度。
结果:
scala - 与宏的奇怪类型不匹配:发现:具有基础类型 A 的单例类型,必需:A
我有
superCall
whitebox 宏应该扩展到的地方super.foo[B](x, y)
,这就是-Ymacro-debug-lite
显示的内容。问题是它无法编译并出现以下错误:
这对我来说毫无意义:y.type
比 更窄B
,所以如果在B
需要时发现它不应该是错误。更奇怪的是,如果我superCall
用它的扩展替换super.foo[B](x, y)
,错误就会消失!
superCall
实现(通过删除不相关的条件略微简化,您可以在 Github看到完整版本):
编辑:添加-uniqid
节目
这解释了错误是如何可能的,但没有解释2的B
不同之处。我尝试重命名B
为C
,以防其中一个引用Foo.foo
's ,但即使程序中只有一个B
,它仍然显示有 2 个不同的 id 。C
C
编辑 2:见Scala typer stage 说 type parameter 的两种用途是不同的。此处生成的树类型器(使用super.foo[B](x, y)
而不是superCall
)是
所以它似乎superCall
扩展到Bar#26820.super.foo#26823[B#26833](x#26836, y#26837)
了。
scala - 查找符号在宏扩展点是否可见或阴影
我有一个Symbol
并且想检查它在宏扩展点是否可见或被遮蔽(例如,通过局部变量),因此在准引号中拼接符号的名称不会引用其他内容。
查看http://docs.scala-lang.org/overviews/reflection/annotations-names-scopes.html,一个想法是查看封闭的词法范围并检查它们是否包含具有相同名称的符号;问题是我找不到获取宏的直接封闭范围的方法。
scala - 如何使隐含可用于反射
使用 Scala (runtime) reelection API,我正在尝试编译大量使用隐式的代码(实际上是 spire.math 库):
尽管这些隐式在调用 toolbox.eval 的范围内是可见的,但反射编译仍然失败:
如何使工具箱可以使用此信息?
scala - 为“精炼”类型获取正确的类型构造函数参数
我在使用反射比较两种类型之间的“兼容性”时遇到问题(实际上我正在编写一个宏)。例如,我想允许Vector[Int] === List[Int]
. 现在我知道了一般的做法。但问题是在这种情况下我无法获取类型构造函数参数:
为什么这是个问题?
现在这有效:
但这不会:
scala - 在scala中传递类型信息
如果我有一些像这样定义的类层次结构
sealed trait A
case class B() extends A
case class C() extends A
// and so on ..
在不同的位置,我想调用一些方法,动态地将上面的类作为类型传递给该函数
(例如method[B](..){..} or method[C](..){..}
:)
如何在运行时实现这一点?
scala - 在 Scala 中,如何获取类方法返回的 TypeTag?
我有一堂课:
它是 scala 反射中的一种方法,允许我从类名“org.apache.project.Foo”和方法名“bar”中获取 typeOf[List[Bar]]?
非常感谢你的帮助!
scala - 在 Scala 中,universe.TypeTag、TypeRef 和 Type 有什么区别?
有 3 个不同的类都绑定到一个 Universe:TypeTag
、TypeRef
和Type
。为什么我们需要全部 3 个?如果我只有 a Type
,如何将其转换为 a TypeTag
or TypeRef
?
例如,我通过 Scala 反射 API 函数获得了一个通用的超类型:
如何将其转换为TypeTag
or TypeRef
?