从 Class[A] 获取 TypeTag[A]

2024-03-03

I have createOld我需要重写并且无法更改它的方法。我想用TypeTag模式匹配提供的类型createNew。目标是找出如何调用createNew from createOld。我目前的理解是编译器没有足够的类型信息A in createOld方法(如果还没有)TypeTag[A].

object TypeTagFromClass {
  class C1
  class C2

  // How to get TypeTag[A] needed by createNew?
  def createOld[A](c: Class[A]): A = createNew ???

  def createNew[A : TypeTag]: A = {
    val result = typeOf[A] match {
      case a if a =:= typeOf[C1] => new C1()
      case a if a =:= typeOf[C2] => new C2()
    }
    result.asInstanceOf[A]
  }
}

可以创建一个TypeTag from a Class使用 Scala 反射,虽然我不确定这个实现是否TypeCreator是绝对正确的:

import scala.reflect.runtime.universe._

def createOld[A](c: Class[A]): A = createNew {
  val mirror = runtimeMirror(c.getClassLoader)  // obtain runtime mirror
  val sym = mirror.staticClass(c.getName)  // obtain class symbol for `c`
  val tpe = sym.selfType  // obtain type object for `c`
  // create a type tag which contains above type object
  TypeTag(mirror, new TypeCreator {
    def apply[U <: Universe with Singleton](m: api.Mirror[U]) =
      if (m eq mirror) tpe.asInstanceOf[U # Type]
      else throw new IllegalArgumentException(s"Type tag defined in $mirror cannot be migrated to other mirrors.")
  })    
}

然而,你并不真的需要完整的TypeTag如果您不需要检查泛型参数和完整的 Scala 类型信息。您可以使用ClassTag是这样的:

def createNew[A: ClassTag]: A = {
  val result = classTag[A].runtimeClass match {
    case a if a.isAssignableFrom(classOf[C1]) => new C1()
    case a if a.isAssignableFrom(classOf[C2]) => new C2()
  }
  result.asInstanceOf[A]
}

或者用一些隐含的糖:

implicit class ClassTagOps[T](val classTag: ClassTag[T]) extends AnyVal {
  def <<:(other: ClassTag[_]) = classTag.runtimeClass.isAssignableFrom(other.runtimeClass)
}

def createNew[A: ClassTag]: A = {
  val result = classTag[A] match {
    case a if a <<: classTag[C1] => new C1()
    case a if a <<: classTag[C2] => new C2()
  }
  result.asInstanceOf[A]
}

您可以使用普通的旧 Java 进一步简化newInstance() method:

def createNew[A: ClassTag]: A = classTag[A].runtimeClass.newInstance().asInstanceOf[A]

当然,只有当您不需要不同类的不同构造函数参数时,这才有效。

调用这个createNew from createOld比那个简单得多TypeTags:

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

从 Class[A] 获取 TypeTag[A] 的相关文章

  • Slick:将操作与 DBIOAction 的 Seq 组合起来

    我有 工作 以下代码 val actions for lt slickUsers insertOrUpdate dbUser loginInfo lt loginInfoAction lt slickUserLoginInfos DBUse
  • sh / Bash shell 脚本中 !# (bang-pound) 的含义是什么?

    我想了解这个 Scala 脚本是如何工作的 usr bin env bash exec scala 0 object HelloWorld def main args Array String println Hello world arg
  • 使用 mapWithState Spark Streaming 过滤部分重复项

    我们有一个DStream 比如 val ssc new StreamingContext sc Seconds 1 val kS KafkaUtils createDirectStream String TMapRecord ssc Pre
  • Scala 工作表在 Intellij 中不起作用

    我有 Intellij IDEA 13 1 2 已编辑 之前为 13 0 2 我使用 scala 插件 我正在尝试使用工作表来评估代码 但我得到的只是两个错误 bad macro impl binding versionFormat is
  • 如何删除spark输出中的compactbuffer

    下面是我在spark shell中运行的程序 但是当我将输出保存在HDFS中时 我得到带有compactbuffer的输出 如何删除spark输出中的compactbuffer Program val a sc textFile datag
  • Spark 对 RDD 中按值排序

    我有一个火花对 RDD 键 计数 如下 Array String Int Array a 1 b 2 c 1 d 3 使用spark scala API如何获取按值排序的新RDD对 所需结果 Array d 3 b 2 a 1 c 1 这应
  • 避免函数内装箱/拆箱

    对于数字密集型代码 我编写了一个具有以下签名的函数 def update f Int Int Double gt Double Unit 然而 因为Function3不是专门的 每个应用程序f结果对 3 个参数和结果类型进行装箱 拆箱 我可
  • 如何将 csv 文件读取为键值对的映射

    我的 csv 文件中有数据 例如 value key A Name B Name C Name 24 Age 25 Age 20 Age M Gender F Gender 我想解析它以生成以下地图 Map Name gt List A B
  • Scala:var List 与 val MutableList

    在 Odersky 等人的 Scala 书中 他们说使用列表 我还没有从头到尾读过这本书 但所有的例子似乎都使用了 val List 据我了解 还鼓励人们使用 vals 而不是 vars 但在大多数应用程序中 使用 var List 或 v
  • collect_list() 是否保持行的相对顺序?

    想象一下我有以下 DataFrame df id featureName featureValue id1 a 3 id1 b 4 id2 a 2 id2 c 5 id3 d 9 想象一下我运行 df groupBy id agg coll
  • 源值 1.5 的错误已过时,将在未来版本中删除

    我使用 scala maven plugin 来编译包含 scala 和 java 代码的项目 我已经将源和目标设置为1 7 但不知道为什么maven仍然使用1 5 这是我在 pom xml 中的插件
  • kafka ProducerRecord 和 KeyedMessage 有什么区别

    我正在衡量卡夫卡生产者生产者的表现 目前我遇到了两个配置和用法略有不同的客户 Common def buildKafkaConfig hosts String port Int Properties val props new Proper
  • Playframework 2.0 在视图模板中定义函数

    我正在开发一个使用 PlayFramework 2 0 的项目 在阅读了一些 scala 之后 我想在视图模板中嵌入一些动态代码 所以 我做了以下事情 def getMystring sequence Int if patternForm
  • 无法使用 Spark 结构化流在 Parquet 文件中写入数据

    我有一个 Spark 结构化流 val df spark readStream format kafka option kafka bootstrap servers localhost 9092 option startingOffset
  • 如何识别远程参与者?

    我有一个远程参与者 客户端 它正在向另一个远程参与者 服务器 注册 然后注销 使用关闭挂钩 然而 虽然服务器接收到注销 但实际sender财产是一个不同的 Channel 对象 所以在我的服务器日志中我有 Registered new cl
  • Scala SBT 版本依赖性二进制兼容性错误 scala-xml

    我有一个在 GitHub 上托管的项目 我使用 scala steward 来保持我的插件和依赖项最新 这在一段时间内有效 但现在使用此类自动更新却变成了一场噩梦 事情是这样的 在我的plugins sbt中 我依赖于scoverage 它
  • 在 Play 2 模板中格式化双精度的正确方法是什么

    这是我的 Play 2 模板的缩写代码 variable com mypackage Variable div class statsbody div class statsform div div
  • 在 scala 中保留推导的更高类型

    我有一个高阶类型 并致力于用它构建一些 DSL 我正在寻找一种方法来定义可以接受类型而无需显式指定此类型的函数 自我描述示例 class Wrap T val data T class DSL def doSomething T x Wra
  • 内存泄漏在哪里?

    我使用 InetAddress 来解析 IP 地址 但现在如果 IP 不可用 则需要存储主机名 所以我介绍了一个班级Host case class Host name String ip InetAddress import Host ad
  • Scala:需要类类型,但找到了 T

    我发现了与此特定问题类似的问题 但是该问题是由于有人试图直接实例化 T 造成的 在这里 我试图创建一个特征 它是一个通用接口来扩展类并将它们自动存储在数据库中 例如 Riak 使用classOf T 使用 Scala 2 10 这是我的代码

随机推荐

  • 如何安装依赖于另一个“目标项目”包的包?

    我在设置 yeoman 时遇到问题 当我尝试安装某些软件包 yeoman compass 时 我不断收到此错误 同时 其他软件包安装良好 git python 外部包不能依赖于目标项目的包 我不确定失败在哪里 但是 nuget 有一个长期存
  • 测试本地时清单中的代码库属性不匹配

    根据 Java 1 7u25 你应该添加Codebase归因于你的清单 我已经做到了 但现在我无法在本地测试它 因为属性值与我的本地 JNLP 由 Netbeans 生成 不匹配 它没有代码库值 清单的代码库应该有什么价值和 或我的 jnl
  • 反应式香蕉节流事件

    我想在reactive banana 中实现某种类型的事件限制 它应该工作 以便如果距最后一个事件通过的时间少于 delta 秒 则不会让事件通过 如果不让其通过 则会存储该事件 并在距离上次触发事件 delta 秒后触发 下面是一个为时间
  • 需要一种算法来像素化 n 维超球面

    我想将向量放入 n 维空间中 这可以通过对 n 维超球面的表面进行像素化来完成 有谁知道用 C 语言对超球面进行像素化有什么好的算法吗 我想要恒定的垃圾箱大小 我的空间仅由正整数组成 您需要您的垃圾箱完全规则吗 如果不是 则随机抛出点 并测
  • 按因子列安全合并数据框

    因子可以帮助防止 R 中的某些编程错误 您无法对使用不同级别的因子执行相等检查 并且在对无序因子执行大于 小于检查时会收到警告 a lt factor letters 1 3 b lt factor letters 1 3 levels l
  • Doctrine 2.0 select查询问题?

    我的朋友 我是 DOctrine 2 0 的新手 我已经配置了 但它不起作用 我有一张桌子 abctable 在数据库中 xyzdb id name age 1 Abc 23 2 Ijk 21 3 Mno 32 Table name abc
  • Visual Studio 装饰扩展事件未被触发

    我正在尝试为我的视觉工作室插件创建一个基本的装饰功能 我已经有一个工具窗口和一些命令设置 我正在尝试让 adronment 工作 按照此走过 https msdn microsoft com en us library ee818135 a
  • Django 1.9 import_module 的导入错误

    当尝试运行任一runserver or shell using manage py我得到一个ImportError例外 我正在使用 Django 1 9 ImportError No module named django utils im
  • Android安装-sdk manager.exe不起作用

    我从developer android com安装了适用于Windows的android SDK installer r08 windows exe 我安装到默认位置 C Program Files Android android sdk
  • Java Spring Boot 的 Docker 基础镜像(`FROM`)是什么?

    什么 Docker 基础镜像 FROM 对于 Java Spring Boot 应用程序 我刚刚开始使用 docker 我看到了FROM inside Dockerfile可以为Java定义图像 例如 FROM java 8 如果我使用 G
  • 405 不允许的方法

    我试图访问https api box com 2 0 files但我收到Expected status code in 200 299 got 405在我的回复中 来自 AFNetworking 在发送请求之前 我已从服务器获取了我的 au
  • Spring Security Oauth2 AuthenticationSuccessEvent 在每个请求时发布

    我正在使用 Spring Security Oauth2 来保护我的 Spring Boot REST 应用程序 我想在用户登录成功和失败后处理一些操作 问题是每个 当我使用用户不记名令牌发送请求时 AuthenticationSucces
  • 如何在Python中使用JSONDecoder?仅获取内部字典进行解码

    我有一个 JSONEncoder 和 JSONDecoder class SimpleTargetJSONEncoder json JSONEncoder converts a SimpleTarget to a Dict so it ca
  • 对象不支持张量流中的项目分配

    在之前的简单程序中 我无法执行简单的任务并收到以下错误 import tensorflow as tf x 1 tf constant 1 2 3 x 1 tf reshape x 1 shape 1 3 x 2 tf constant 2
  • SQLite UTF-8 编码

    我尝试运行脚本 read FILE 具有 UTF 8 字符串 我使用了 pragma 命令 PRAGMA encoding UTF 8 但我得到了错误的字符 如果我自己创建表并插入值 则一切正常 我应该怎么做才能正确运行脚本 顺便说一下 我
  • JMSi18nRoutingBundle 语言选择器

    我已经实现了以下语言切换器 ul if path app request attributes get route li a href ES a li li a href EN a li li a href IT a li else ul
  • 返回 32(或 64)位的 python 哈希函数

    我正在寻找一个返回 32 或 64 位的哈希函数 我尝试了 hashlib 中的 md5 例如 import hashlib hashlib md5 b H hexdigest gives c1d9f50f86825a1a2302ec244
  • jQuery的append()与appendChild()

    这是一些示例代码 function addTextNode var newtext document createTextNode Some text added dynamically var para document getEleme
  • 集成appodeal时出现重复输入错误

    error 错误 任务 app transformClassesWithJarMergingForDebug 执行失败 com android build api transform TransformException java util
  • 从 Class[A] 获取 TypeTag[A]

    I have createOld我需要重写并且无法更改它的方法 我想用TypeTag模式匹配提供的类型createNew 目标是找出如何调用createNew from createOld 我目前的理解是编译器没有足够的类型信息A in c