LabelledGeneric 获取类名

2024-04-18

我对 Shapeless 相当陌生,正如人们从我的问题中推断出来的那样。给定一个实例LabelledGeneric,如何获取它所代表的类的名称。我可以从中获取字段名称信息Keys,所以我想我需要一些其他类型的Witness它封装了类型本身,但我不知道是哪个。

例如,如果我在 com.bar 包中有一个名为 Foo 的案例类,我想获取字符串“com.bar.Foo”(或者单独获取也可以)。

implicit def example[T, Repr <: HList](implicit label: LabelledGeneric.Aux[T, Repr],
                                         kk: Keys[Repr]): Bibble[T] = new Bibble[T] {
  override def typeName(value: T): String = ???
}

无形的Generic提供案例类和密封特征的乘积和表示,这意味着如果我们有一个像这样的简单 ADT:

sealed trait Base
case object Foo extends Base
case class Bar(i: Int, s: String) extends Base

Then Generic[Base]会给我们一个映射到Foo.type :+: Bar :+: CNil—i.e. a Foo.type or a Bar(其中or意味着我们正在谈论类型理论术语中的“和类型”),以及Generic[Bar]给我们一个映射到Int :: String :: HNil,即Int and a String(产品类型,其中“产品”的含义与“产品”的含义大致相同)scala.ProductN标准库中的类型)。

LabelledGeneric使用乘积和表示的增强版本,其中乘积或总和中的每个项都标有标签。对于密封特征,这些将是每个子类型的构造函数名称,对于案例类,它们将是成员名称。这些不是完全限定的名称,只是在本地消除歧义的标签。

Generic and LabelledGeneric无意用作编译时反射的通用工具。例如,它们不可用于任意类型,并且不提供对类型本身名称的访问。

你最好的选择可能是使用TypeTag,但是如果您想要名称的类型级别表示(例如LabelledGeneric提供标签),您需要使用宏生成的实例定义自己的类型类。像下面这样的东西应该有效:

import scala.language.experimental.macros
import scala.reflect.macros.whitebox.Context

trait TypeInfo[A] { type Name <: String; def name: String }

object TypeInfo {
  type Aux[A, Name0 <: String] = TypeInfo[A] { type Name = Name0 }

  def apply[A](implicit ti: TypeInfo[A]): Aux[A, ti.Name] = ti

  implicit def materializeTypeInfo[A, Name <: String]: Aux[A, Name] =
    macro matTypeInfoImpl[A, Name]

  def matTypeInfoImpl[A: c.WeakTypeTag, Name <: String](c: Context): c.Tree = {
    import c.universe._

    val A = c.weakTypeOf[A]
    val name = A.typeSymbol.name.decodedName.toString.trim

    q"new TypeInfo[$A] { type Name = ${ Constant(name) }; def name = $name }"
  }
}

但是,如果您只需要值级字符串,这对于您的用例来说可能有点过分了。

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

LabelledGeneric 获取类名 的相关文章

随机推荐

  • 在 jQuery 模板中获取索引

    我正在使用 jQuery 模板插件 不知道如何获取项目的索引 http api jquery com category plugins templates http api jquery com category plugins templ
  • 解析器组合器的类型

    如果我有一个解析器a Parser A和一个解析器b Parser B然后我可以将它组合成一个解析器a b Parser Either A B 这可行 但当您开始添加更多替代方案并获取类似类型时 会变得有点棘手Either A Either
  • Play Framework 2.6 CSRF 和会话

    我遇到了奇怪的问题 我正在我的网站上实现购物车功能 并使用会话来存储购物车位置 我有一个 POST 操作来将新位置添加到购物车 并且我启用了 CSRF 过滤器来保护网站 我在产品页面上用ajax调用它 所以第一次调用没问题 但第二次调用说未
  • Android相机参数setPictureSize导致图片出现条纹

    我正在尝试使用 Android 相机拍照 我需要捕获 1600 宽 x 1200 高 图像 第 3 方供应商要求 我的代码似乎适用于许多手机摄像头 但 setPictureSize 会导致某些手机 三星 Galaxy S4 三星 Galax
  • 为什么 Java 的 SSLSocket 发送版本 2 客户端问候?

    The SSLSocket getEnabledProtocols 方法返回以下内容 SSLv2Hello SSLv3 TLSv1 事实上 当我打电话时connect 并且我打开了 SSL 调试 我看到使用了 v2 客户端 hello ma
  • Java:BufferedReader 的 readLine 方法的效率和可能的替代方案

    我们正在努力减少延迟并提高用 Java 编写的进程的性能 该进程通过 readLine 方法从套接字消费数据 xml 字符串 缓冲读取器 http java sun com javase 6 docs api java io Buffere
  • /dev/mem的访问权限

    我有一系列关于 dev mem 网上很多文章 好像都提到了 dev mem作为通往 Physical RAM 但如果我是对的 dev mem是通往 Physical Address Space 处理器的控制寄存器可能包括许多硬件外设的控制寄
  • 如何创建 Android Spinner 作为弹出窗口?

    我想在用户点击菜单项时弹出一个旋转对话框 以允许用户选择一个项目 我是否需要一个单独的对话框 或者我可以直接使用 Spinner 吗 我懂了这个链接 http developer android com reference android
  • 美国边界线未添加到美国分散地区的 geom_map 地图中

    我有一张美国分散地区的地图 这是在以下问题中 包含数据链接 合并数据后 ggplot2 geom polygon 的映射变得疯狂 https stackoverflow com q 48469441 1813491 回答得很好 然后我尝试添
  • Gradle 同步失败:内容长度分隔的消息正文过早结束(预期:27633912;已接收:12844960)

    我已经安装了 Android Studio 3 1 4 但 Gradle 版本 4 4 未同步 它说 Gradle 同步失败 内容长度分隔的消息正文过早结束 预计 27633912 已收到 12844960 构建 Gradle https
  • 报告多个 Python 版本的累积覆盖率

    我的代码根据当前的 Python 版本有条件地运行 因为我支持同一包中的 2 6 2 7 和 3 3 我目前使用默认版本的 Python 生成这样的覆盖率报告 coverage run source mypackage setup py t
  • Node.js-“npm installexpress”错误:0906D06C:PEM 例程:PEM_read_bio npm

    我已经安装了node js 并且npm也随之安装了 在我的 Windows 命令提示符中 当我写 npm install express 时 它给出以下错误 如何解决这个问题 C 用户 gt npm v 2 11 2 C Users gt
  • 使用 vim 处理文本文件中的 \r \n ^M ​​^@

    当我将 excel 文件中的数据行保存为制表符分隔的 txt 文件 然后在 VIM 中打开这些文件时 我发现 excel 中曾经的多行文件现在是 VIM 中的单行文件 可以使用一些替换命令在 VIM 中分隔 行 s M r n g 此后 线
  • Ruby 相当于 perl 的“Data::Dumper”,用于打印深层嵌套的散列/数组

    这不是重复的Ruby 相当于 Perl Data Dumper https stackoverflow com questions 2159426 ruby equivalent of perl datadumper 这个问题已经存在超过
  • 如何下载 Java SE 6 更新 121?

    我需要 JDK6 来运行遗留应用程序 但我还需要 TLS 1 2 支持 这个链接 http www oracle com technetwork java javase overview 156328 html R160 121表示 Jav
  • CAPL 写入文本文件

    我对 CAPL 语言还很陌生 因此 我在将数据写入 txt 文件时遇到问题 这是我写的代码 includes variables message Generate Num Gen message Logger Logs msTimer ti
  • 在某些条件下使用钩子自动将一个分支合并到另一个分支?

    我的 github 存储库中有两个分支 master and dev分支 我有一个需要合并的要求master分支到dev在以下条件下分支 一旦 PR 直接合并到 master 分支 那么我需要自动将 master 分支合并回 dev 分支
  • 无法使用相同的私钥签署 Android 应用精简版

    我刚刚签署了我的付费应用程序 现在我想使用相同的私钥签署它的精简版 我现在的问题是 收到此错误 jarsigner 无法打开 jar 文件 我必须为其创建另一个密钥库吗 或者问题是否来自于我将其保存为不同的文件名 我能做些什么 谢谢 这个问
  • 在 Angular 8 应用程序中实现会话存储

    我正在构建一个电影应用程序来帮助我的学习 我想知道如何捕获按钮的点击次数并将其保存在会话存储中 我已经能够让点击工作了 它增加并显示每个按钮的点击次数 我用指令做到了这一点 我还尝试将按钮的 id 作为键和点击次数作为值附加到会话存储中 我
  • LabelledGeneric 获取类名

    我对 Shapeless 相当陌生 正如人们从我的问题中推断出来的那样 给定一个实例LabelledGeneric 如何获取它所代表的类的名称 我可以从中获取字段名称信息Keys 所以我想我需要一些其他类型的Witness它封装了类型本身