问题标签 [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 - 无法指定 ClassTag 时获取运行时类信息
在编写测试以验证是否在内部某处选择了正确的类型类时,我遇到了类型擦除。我没有添加ClassTag
到签名的选项,除非我还污染了特征的非测试版本,因为添加: ClassTag
会更改方法签名,使其不再是覆盖,例如:
这会导致以下编译错误:
错误:(12, 20) 方法 bar 不会覆盖任何内容 注意:类 FooStubImpl 的超类包含以下名为 bar 的非最终成员:
是否有另一种方法可以在运行时获取不需要的参数化类型的类型信息ClassTag
?
scala - 引用成员类型的 Scala 宏
我有一个成员类型的特征,并且想要一个带有包含此类型的签名的宏:
这不起作用,因为bazImpl
必须属于静态(即非成员)object
或宏包。但在这两种情况下,我都没有一个foo: Foo
所以我可以写foo.Bar[A]
。
我能想到的一种解决方法是使用Foo#Bar[A]
和添加演员表:
但我想避免它(既因为它不完全是类型安全的,又因为实际情况更复杂)。有什么选择吗?
scala - 类型参数与 WeakTypeTag 反射 + quasiquoting 不匹配(我认为!)
受travisbrown的启发,我正在尝试使用宏来创建一些“智能构造函数”。
给定
和
宏应该找到 的所有子类Hello
,查看它们的构造函数,并提取一些元素来填充这个“智能构造函数”的树:
我希望得到:
而是得到:
乍一看,这棵树对我来说还不错:
但我想它是无形的。如果我天真地尝试用 更新 typeParams info.typeParams.map(p => TypeName(p.name.toString))
,当我进行准引用时,我会得到“无法将 A 拼接为类型参数”。
我哪里错了?谢谢参观。
-艾莉亚
PS我一直在根据本文尝试使用 toolbox.untypecheck / typecheck但还没有找到有效的组合。
scala - 如何匹配对 Wart Remover 中特定方法的调用?
我正在写一个疣去除器插件。我想检测对某些可能返回的方法的调用null
,例如System.getProperty
. 但是,我尝试匹配它们的所有方法都失败了。这是我最近的尝试:
我尝试过的大多数方法都不会导致应该有错误的行出现错误 - 尽管当我尝试.symbol
而不是 时.toString
,顶级树开始到处匹配。我猜.symbol
是null
在这些情况下......
我还尝试使用showRaw
并复制和粘贴相关的构造函数,但这不起作用,因为它不是有效的 Scala 代码 -java.lang
在 的输出中显示为标识符showRaw
,而不是包装在它实际包装的任何构造函数中.
scala - Scala 反射:调用 Function1 的应用方法 - 多种选择?
我正在尝试使用 v2.11.6 中的 scala 反射 api 调用一个函数:
使用ref.reflectMethod(apply.asMethod)
它时会抱怨apply
on 的多种替代方案ref
。检查apply.asTerm.alternatives
揭示了两种方法,一种使用签名(x$1: Int)Int
,另一种使用(v1: T1)R
. 打电话
(使用第二种选择)返回正确的结果 (3)。但是调用第一个替代方案会引发异常:java.lang.IllegalArgumentException: object is not an instance of declaring class
这些替代方案是什么,我如何确保始终调用正确的替代方案?使用此方法调用 Function2 或更高版本似乎也存在问题,那么正确的方法是什么?
scala - 从 Scala 中的 MethodMirror 实例获取方法的函数类型
假设我有一个MethodMirror
为对象的某个方法创建的实例。通过镜像的字段,我可以轻松访问方法的返回类型和参数。但我实际上需要获取此方法将具有的类型作为函数。
这是一个玩具代码示例,可以帮助我解释我想要实现的目标。我正在使用 Scala 2.11.6。
我想从代表函数Type
的实例中生成实例。methodMirror
对于这个例子,它应该是(String, String) => Int
. 我更喜欢一个不太依赖于具体 ScalaFunctionX
类的解决方案。
scala - 在子类中获取 typeOf[this.type]
如何让超类访问其具体实例的类型?
所以,这个想法是 Base.t 应该反映实例的具体类型......
scala - Scala 反射 - Java 枚举泛型对象
我正在使用 Scala 2.10,并且正在努力使用以下通用方法来反序列化 java 枚举。
我收到的错误消息是:
这很明显,但我不知道如何正确解决它。有人可以给我一个提示吗?
scala - 多项目 SBT 构建错误的符号引用 scala-reflect 运行时
我的任务是将旧的 ant 构建脚本重写为 SBT。碰巧的是,我们的套件由 3 个模块组成:
- 一个 Play 2.3 前端网络服务器;
- 用于从其他各种系统检索数据的后端;
- 一个中间模块,包含一些用于数据库访问和业务逻辑的共享类。
下面是我的 Build.scala 文件的摘录:
但是,当我尝试编译源代码时,出现以下错误:
在类文件“ValueConverter.class”中遇到对 scala.reflect.runtime 的错误符号引用。无法访问包 scala.reflect 中的术语运行时。当前类路径可能缺少 scala.reflect.runtime 的定义,或者 ValueConverter.class 可能已针对与当前类路径中找到的版本不兼容的版本进行编译。
源代码按以下结构组织:
- 背部
- 源代码
- 测试
- 库
- 中间
- 源代码
- 测试
- 库
- 正面
- 源代码
- 测试
- 库
这里每个 lib 文件夹都包含一些手动维护的库(这就是我们要迁移到 sbt 的原因)。
关于如何解决这个问题的任何想法?
scala - 具有多种通用类型和 1 个通用工作单元的 Scala Fork-Join-All
我正在尝试编写一个接受多种泛型类型并将一个工作单元作为参数来执行的方法。
这个想法是工作单元是一个通用的功能,它本身就是通用的。例如,假设它类似于以下内容:
loadModelRdd() 将在一些内部处理(如加载模型信息等)之后构造给定类型的 RDD。
我一直在破解的原型方法如下所示(无效):
这是我正在处理的代码的缩短版本,因为我实际上正在考虑接受多达 10 种不同的类型。
如您所见,forkAll 方法的总体目标是将工作单元包装在 Future 中,对每种类型的工作单元执行 fork-join,然后将结果作为 Tuple 的结果返回。一个示例消费者声明将是:
即此时我想分叉加入并等待结果,但我希望并行执行执行,然后收集回驱动程序(具体来说是 Spark 驱动程序)。
问题是我不确定在构造 Future {} 块时如何强制 forkAll 中的工作单元返回的类型。如果没有 forkAll,实现如下所示:
我正在考虑这样做有两个原因:
- 为与此模型匹配的任何工作单元抽象分叉连接的细节。
- 该代码的一个版本明确说明了工作单元是什么,它正在生产中工作,并负责将长时间运行的块的执行减少近一半。我有几个可以应用此模式的执行步骤
这在 Scala 的类型系统中是可能的吗?还是我应该从不同的角度看待这个问题?我已经尝试了几种实现(包括此处描述的一种),但我还没有找到适合我当前对问题的看法的一种
如果需要任何其他信息,请告诉我。
谢谢!