如何在scala中运行时查找类参数数据类型

2024-06-22

import scala.reflect.runtime.universe
import scala.reflect.runtime.universe._

def getType[T: TypeTag](obj: T) = typeOf[T]

case class Thing(
  val id: Int,
  var name: String
)
val thing = Thing(1, "Apple")

val dataType = getType(thing).decl(TermName("id")).asTerm.typeSignature

dataType match {
 case t if t =:= typeOf[Int] => println("I am Int")
 case t if t =:= typeOf[String] => println("String, Do some stuff")
 case _ => println("Absurd")
}

无法消化为什么结果是Absurd代替I am int?

我的目标是在运行时了解类参数的数据类型并将其与预定义的类型匹配。


均为当前dataType and typeOf[Int]打印为Int但如果你这样做showRaw你会明白为什么它们不匹配

showRaw(dataType) // NullaryMethodType(TypeRef(ThisType(scala), scala.Int, List()))
showRaw(typeOf[Int]) // TypeRef(ThisType(scala), scala.Int, List())

问题是,只是类型Int以及返回的 nullary 方法的类型Int是不同的类型。

尝试添加.resultType

val dataType = getType(thing).decl(TermName("id")).asTerm.typeSignature.resultType

dataType match {
  case t if t =:= typeOf[Int] => println("I am Int")
  case t if t =:= typeOf[String] => println("String, Do some stuff")
  case _ => println("Absurd")
} // I am Int

还值得一提的是.decl(TermName("id"))返回 getter 符号,它是.decl(TermName("id "))(带有空格)返回字段符号。因此,您也可以在符号名称中使用空格,而不使用空格.resultType

val dataType = getType(thing).decl(TermName("id ")).asTerm.typeSignature

我将添加到@TomerShetah's answer https://stackoverflow.com/a/65072704/5249621如果目标是“模式匹配”案例类的所有字段,那么这也可以在编译时(大部分)使用无形的 https://github.com/milessabin/shapeless:

import shapeless.Poly1
import shapeless.syntax.std.product._

object printTypes extends Poly1 {
  implicit val int: Case.Aux[Int, Unit] = at(t => println(s"I am Int: $t"))
  implicit val string: Case.Aux[String, Unit] = at(t => println(s"String, Do some stuff: $t"))
  implicit def default[V]: Case.Aux[V, Unit] = at(t => println(s"Absurd: $t"))
}
  
thing.toHList.map(printTypes)
// I am Int: 1
// String, Do some stuff: Apple

https://scastie.scala-lang.org/DmytroMitin/N4Idk4KcRumQJZE2CHC0yQ https://scastie.scala-lang.org/DmytroMitin/N4Idk4KcRumQJZE2CHC0yQ

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在scala中运行时查找类参数数据类型 的相关文章

  • Slick 3 交易

    我对 slick 3 文档描述事务的方式感到困惑 我有 2 个光滑的代码 如下所示 def doSomething DB withTransaction implicit session gt userDao doSomething add
  • 测试期权价值的更好方法?

    我经常发现自己Option T 对于某些类型T并希望根据某个值来测试期权的价值 例如 val opt Some oxbow if opt isDefined opt get lakes do something 以下代码是等效的 并且不需要
  • Scala 插入列表中的特定位置

    这是我确实解决的问题 但是作为一个完全命令式的 Scala 菜鸟 我觉得我发现了一些完全不优雅的东西 任何改进的想法表示赞赏 val l1 4 1 2 3 4 Nil original list val insert List 88 99
  • 通过Listener获取Spark thrift服务器查询中读取的行数

    我正在尝试为我们的 ST 服务器构建一个监控系统 到目前为止 诸如记录查询 检索的行 红色和花费的时间之类的事情都很好 我已经实现了一个自定义侦听器 我能够毫无问题地检索查询和时间 侦听SparkListenerSQLExecutionSt
  • 在 Scala REPL 中访问包私有方法

    假设我有一个private stuff method Stuff something in org my stuff 我可以在 Scala REPL 中做些什么 以便我可以调用Stuff something没有得到错误error value
  • 超时对“Future”进行排序

    我利用了TimeoutScheduler介绍于Scala Futures 内置超时 https stackoverflow com questions 16304471 scala futures built in timeout 但是 现
  • 如何在不进行硬编码的情况下使用 Cake 模式进行依赖注入?

    我刚刚阅读并享受蛋糕图案文章 http jonasboner com real world scala dependency injection di 然而 在我看来 使用依赖项注入的关键原因之一是您可以改变 XML 文件或命令行参数所使用
  • 如何在 C# 中从字符串调用委托?

    是否可以通过变量名称 作为字符串 调用存储在变量中的委托 我想我必须使用反射机制 但我没有得到任何结果 示例代码 class Demo public delegate int DemoDelegate private static int
  • 使用 Scala 的解析器组合器时如何忽略不匹配的前面文本?

    我真的很喜欢解析器组合器 但是当我不关心相关文本之前的文本时 我对我提出的提取数据的解决方案并不满意 考虑这个小型解析器来获取货币金额 import scala util parsing combinator case class Amou
  • JavaScript 中 Scala View 的等效项

    在斯卡拉中 view允许防止创建全新的集合 例如在Scala中 视图 有什么作用 https stackoverflow com questions 6799648 in scala what does view do JavaScript
  • 选择排序通用类型实现

    我以自己的方式实现了选择和快速排序的递归版本 我试图以一种可以对任何泛型类型的列表进行排序的方式修改代码 我想假设提供的泛型类型可以转换为 Comparable at运行 有人有关于如何执行此操作的链接 代码或教程吗 我正在尝试修改这个特定
  • 在 Spark 中访问数组列

    Spark DataFrame 包含类型为 Array Double 的列 当我尝试将其返回到 map 函数时 它会抛出 ClassCastException 异常 以下 Scala 代码生成异常 case class Dummy x Ar
  • Scala变量作用域问题

    我有一个 scala 语法问题 假设我有一个简单的依赖模式构造 如下所示 trait Master val foobar object SubObject extends SubObject foobar foobar trait SubO
  • Scala 中表达式和语句有什么区别

    我是 Scala 世界的新手 想知道表达式和语句之间有什么区别 以及为什么 if else 用于表达式 而不是语句 是否有办法在 if else 中使用语句 EDIT 正如 J rg W Mittag 在评论中指出的 这个答案实际上是错误的
  • 结构化流式自定义重复数据删除

    我有一个从 kafka 进入 dataFrame 的流数据 我想根据 Id 删除重复项并根据时间戳保留最新记录 样本数据是这样的 Id Name count timestamp 1 Vikas 20 2018 09 19T10 10 10
  • Shapeless 中 TypeClass 特征的 emptyCoproduct 和 coproduct 方法的用途是什么

    我并不完全清楚这样做的目的是什么emptyCoProduct and coproduct的方法TypeClass无形中的特质 什么时候会使用TypeClass特质而不是ProductTypeClass 这两种方法的实施方式有哪些示例 假设我
  • 如何拦截 Play 2 + Scala 中的所有控制器请求?

    在 Play 2 的 Java 风格中 有全局设置 onRequest http www playframework org documentation 2 0 4 JavaGlobal 可用于拦截所有传入控制器的请求 但在Scala 等效
  • 向 UIImageView 添加反射的最有效方法是什么

    我只想要最简单的方法在易于管理的 UIImageView 下进行反射 只需使用iPhone SDK 库中的示例代码 http developer apple com library ios samplecode Reflection Int
  • 如何使用 flex/bison 解析 Scala 语法中的新行?

    我想用flex和bison解析Scala语法 但我不知道如何解析 Scala 语法中的换行符 如果我将换行符解析为令牌T NL 这是Toy l例如 a zA Z a zA Z0 9 yylval gt literal strdup yy t
  • 使用反射检测属性的访问修饰符类型

    我编写了一些代码来使用反射查看属性 我已经使用反射从类中检索了属性列表 但是我需要查明该财产是公共的还是受保护的 例如 public string Name get set protected int Age get set Propert

随机推荐

  • Postman:如何同时发出多个请求

    我想发布数据Postman谷歌浏览器扩展 我想用不同的数据发出 10 个请求 并且应该同时进行 在邮递员中可以这样做吗 如果是 有人可以向我解释如何实现这一目标吗 我想邮递员中没有这样的功能来运行并发测试 如果我是你 我会考虑Apache
  • Node.js:优雅重启和服务器正常运行时间,如何?

    我一直在使用实时应用程序Node js and Socket io 我想将其从本地测试阶段转移到与我们的一些用户一起进行测试 问题是 如果我关闭到服务器的 ssh 会话 它也会停止我开始使用的服务器node app js 我想过使用nohu
  • 如何计算圆圆周上点的(x或y)坐标?

    px and py是圆圆周上一点的 x 和 y 坐标 Given the center of the circle as cx cy the radius of the circle as r px 如何计算 的值py 谢谢 给定 px p
  • ProgressDialog 中没有进度旋转器

    我正在尝试创建一个 ProgressDialog 就像现在 Play 商店中几乎每个应用程序中看到的那样 我正在使用代码 getActivity runOnUiThread new Runnable Override public void
  • 如何计算函数被调用的次数,FP方式

    我目前正在通过SICP http mitpress mit edu sicp 与哈斯克尔 练习 1 15 询问一个函数被调用了多少次 这个想法可能是您应该使用替换方法 但我想知道如何在代码中执行此操作 在命令式语言中 我们可以保留一个全局变
  • 相互递归泛型枚举

    通用递归enum 我可以轻松地用 Swift 表达一个通用的递归枚举 indirect enum Tree
  • Ghostscript 转换 PDF 并输出为文本文件

    1 我需要将PDF文件转换为txt 文件 我的命令似乎有效 因为我在屏幕上看到了转换后的文本 但不知何故我无法将输出定向到文本文件中 public static string GetArgs string inputPath string
  • 如何告诉 PMD 忽略未使用代码的 @PostConstruct 方法

    我们有一个由 PMD 检查是否存在违规行为的项目 例如未使用的私有方法 我们的问题是我们不知道是否可以忽略带有注释的私有方法 PostConstruct 该规则定义如下
  • 使用自定义布局进行共享扩展

    我想开发带有自定义标注的 ios 共享扩展 在苹果文档中 要提供自定义撰写视图而不是标准视图 请取消选择 Xcode 目标添加中的 使用标准社交撰写界面 窗格 取消选中此复选框时 默认 ShareingViewController 类基于
  • 使用 Thread.sleep 线程休眠时的 CPU 消耗

    我有一个服务器程序 它会轮询数据库以获取新请求 我希望以 1 分钟的间隔进行轮询 因此 我在程序 while 循环中设置了 Thread sleep 问题是 只要该程序应该 睡眠 CPU 消耗就会急剧上升 即大约 25 30 矛盾的是 当程
  • git diff 文件与上次更改的比较

    是否可以让 git 生成当前存在的特定文件与上次更改它之前存在的文件之间的差异 也就是说 如果我们知道 git log oneline myfile 123abc Fix some stuff 456def Frobble the foos
  • 无法在 Linux 上运行 Pyinstaller 可执行文件

    我正在尝试pyinstaller首次 我创建了一个名为hello py只需一行代码 print hello 我使用以下命令来制作二进制文件 pyinstaller hello py 该过程成功完成 并在以下位置创建了一个二进制文件dist
  • 顶点着色器中的透视划分?

    当在顶点着色器中使用透视矩阵时 我应该编写代码来除以 w 还是在稍后阶段自动完成 我的问题的原因是我看到很多顶点着色器使用 gl Position matrix pos 如果后面有一个阶段将向量除以它的 w 分量 这就有意义了 然而 直到我
  • java.sql.SQLSyntaxErrorException: ORA-00955: 名称已被现有对象使用

    我正在使用 Oracle 11g R2 我想创建一些用户表 当我运行查询时 它创建了几个表并生成java sql SQLSyntaxErrorException ORA 00955 名称已被现有对象使用例外 Connection con p
  • 有人有 Sphinx 语音识别的经验吗?

    有没有人用过Sphinx http cmusphinx sourceforge net html cmusphinx php语音识别堆栈来构建 IVR 应用程序 我正在寻找开源替代方案 以替代 MSFT 和其他公司提供的昂贵且有些限制的选择
  • 用换行对字符进行位移位? C++

    我有一个二进制文件 它将作为字符读入 每个字符都被其他人向左移动了未知次数 假设有换行 我希望能够读取每个字符 然后将移位向右换行 我想必须手动计算出移位的次数 因为我还没有找到其他方法 所以 我当前的想法是读入一个字符 用 temp 创建
  • Android获取地球坐标系上的加速度计

    我想在 Android 上获取加速度计并将它们放在地球坐标系上 就像这个主题一样从设备坐标系到绝对坐标系的加速度 https stackoverflow com questions 11578636 acceleration from de
  • React-navigation 5 一次导航多条路线

    有没有比以下更好的多条路线导航方法 NavigatorService navigate Screen1 params NavigatorService navigate Screen2 params Where Screen1 and Sc
  • Firebase commitChangesWithCompletion on ProfileChangeRequest 未触发

    我从 Firebase 参考中获取确切的代码 将其放入方法中 然后完成处理程序 也不是函数 执行 有谁知道为什么吗 let user FIRAuth auth currentUser if let user user let changeR
  • 如何在scala中运行时查找类参数数据类型

    import scala reflect runtime universe import scala reflect runtime universe def getType T TypeTag obj T typeOf T case cl