问题标签 [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.

0 投票
1 回答
41 浏览

scala - 在 Scala 反射中,一个宇宙可以有多个镜像吗?

在 scala.reflection.api.Universe 的所有子类中,我从未见过 Mirror 的多个实现。这是否意味着可以将 Mirror 与 Universe 合并。将 Universe 和 Mirror 分开的设计决策是什么?

0 投票
1 回答
145 浏览

scala - 在 Scala 反射中,编译时宇宙是否可访问?

在本文档中:

http://docs.scala-lang.org/overviews/reflection/environment-universes-mirrors.html

Scala 反射宇宙被描述为有 2 个实现:1 个用于运行时(在 scala.reflect.runtime 下)和 1 个用于编译时(在 scala.reflect.macro 下)。

但是,我只能通过以下方式访问运行时 Universe:

编译时 Universe 包下没有具体的实现。实现和调用它的能力是否故意隐藏,实现由 scala 编译器硬编码?如果是这样,那么在使用 Scala 反射之前强制指定一个 Universe 的原因是什么?

非常感谢您的任何见解。

0 投票
1 回答
308 浏览

scala - 在 Scala 反射中,为什么 TypeTag 上的反射函数仍然有类型擦除?

考虑以下scala程序:

由于 TypeTag 同时具有 Seq 和 String 信息,我希望fn.returnType给出正确的结果“String”,但在这种情况下,我得到了以下程序输出:

随后抛出此异常:

显然 String 类型被删除了,只留下一个通配符类型 'A'

为什么 TypeTag 无法按预期产生正确的擦除类型?

0 投票
2 回答
280 浏览

scala - Scala:在方法中使用 TypeTag

我正在尝试编写这样的方法:

哪里mapTo有签名:

使用org.scala-lang.scala-reflect能够执行以下操作:

foo[String](1)foo[List[Double]](10)等等。

我尝试以不同的方式编写它,但我得到了不同的编译错误。有没有办法让这样的东西起作用?

此链接如何从 TypeTag 中获取 ClassTag,或同时获取两者?不澄清我要做什么。看起来像是试图“过滤”一些关于某个类的信息。

0 投票
2 回答
158 浏览

scala - 如何从 10L 中获取 ClassTag[Long]

使用以下代码:

只得到盒装类型:

有更好的解决方案吗?或者在scala中是不可能的?

0 投票
1 回答
54 浏览

scala - 通过类名查找类的参数

我正在做一个宏注释,我有这样的东西:

问题是 whenclassName是类似的东西List,它显然会抱怨,因为它需要参数。如果是List[String],那很好。

老实说,我不完全理解为什么,例如,classOf[List]考虑到 List 中的泛型类型是不变的,为什么不被接受?执行classOf[List[String]]and classOf[List[Integer]],返回相同的类。

因此,假设我的方法findClass将始终接收一个没有参数或具有不变参数的类,我该如何对ValDef?

0 投票
2 回答
7733 浏览

scala - 在 Scala 反射中,如何获取具体子类的泛型类型参数?

假设我有一个通用超类:

和一个具体的子类:

我想通过scala反射获取函数“fn”的类型参数,所以我选择并过滤它的成员:

我期待 scala 给我正确的结果,也就是说List(List(Int)),我只得到了通用的List(List(T))

仔细研究文档,我发现 typeSignature 是罪魁祸首:

它建议我使用替代方案:

但是,由于类 Example 不再是通用的,我无法从 typeTag[Example] 获取站点,谁能建议我如何仅给定 typeTag[Example] 获取 typeOf[Int]?或者没有办法做到这一点,我必须恢复到 Java 反射?

非常感谢你的帮助。

更新:经过一些快速测试后,我发现即使MethodSymbol.returnType也无法按预期工作,以下代码:

也 yield T,它不能被asSeenFrom纠正,因为下面的代码不会改变结果:

0 投票
0 回答
186 浏览

scala - 如何使用 Scala 宏检查实现

我需要找出方法实现中是否使用了某种方法。例如,我有一个很棒的应用程序:

我想测试方法是否getGreetings使用了fillArray 的伴生对象的功能。测试将通过上述实现成功并失败,例如:

在这段视频的帮助下,我了解到我可以使用这样的宏检查实现:

现在printTree揭示了使用的fill方法:

这里缺少的部分是如何对任何方法的代码做同样的事情,这样我就可以获得方法内部的树getGreetings

提前致谢 :)

0 投票
0 回答
228 浏览

scala - 如何将 scala.reflect.io.File 导入我的项目?

我正在使用 IntelliJ IDE。

我想import scala.reflect.io.File从包中 - scala-reflect-2.11.4。但是当我输入时import scala.reflect,编译器认为我正在尝试使用class reflect包中的scala-library-2.11.8

如何强制编译器使用 import class scala.reflect.Filefrom scala-reflect-2.11.4

0 投票
1 回答
471 浏览

scala - 在 scala 宏中保留方法参数名称

我有一个界面:

我有一个宏,它迭代接口的方法并使用方法名称和参数进行处理。我通过执行以下操作访问方法名称:

如果我打印出 的doSomething参数名称,usefulName则变为x$1. 为什么会发生这种情况,有没有办法保留原始参数名称?

我正在使用 scala 版本 2.11.8、宏天堂版本 2.1.0 和黑盒上下文。

该接口实际上是我控制的一个单独的 sbt 项目中的 java 源代码。我试过编译:

参数标志应该保留名称,但我仍然得到与以前相同的结果。