scala - 从 Map[String, Type] 生成案例类?

标签 scala code-generation shapeless

给定一个函数 f , 给定一个 Map[String, MyType] , 返回 HList :

package net

import shapeless._

sealed trait MyType
case object MyInt extends MyType
case object MyStr extends MyType

object Mapper {

    def f(m: Map[String, MyType]): HList = m.foldLeft[HList](HNil){ (acc, elem) =>
        val (key, t) = elem
        t match {
            case MyInt => classOf[Int] :: acc
            case MyStr => classOf[String] :: acc
        } 
    }
}

我测试过:

import net._
val list = Map("foo" -> MyInt, "bar" -> MyStr)

scala> Mapper.f(list)
res0: shapeless.HList = class java.lang.String :: int :: HNil

如何使用上述方法(或另一种方法)构建 case class成员匹配String键,以及 f 的输出给出的类型?

所以,我正在寻找:

g(Map("foo" -> MyInt, "bar" -> MyStr))输出 case class X(foo: Int, bar: String)其中 X是任意选择的,即此时不重要。

我想到了使用 Generic[X] , 但我不知道如何获得 Generic没有 case class首先。

最佳答案

在编译时验证的情况下,您尝试做的事情不会在 Scala 中发生。这里的问题正是你所阐述的,你没有你试图提前构建的 case class 的定义。该定义提供了使用 Record 类型构造同构的脚手架。

就是说,我们也许可以通过调用动态和反射来处理一些事情,但我不清楚您甚至如何在代码中利用它。您不会事先知道字段名称或它们的类型。那么您将如何围绕它们编写代码?

关于scala - 从 Map[String, Type] 生成案例类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39536712/

相关文章:

scala - 创建新的 SparkContext 时出现 Hadoop FileAlreadyExistsException

java - 我们如何在编译时访问 ByteBuddy 生成的方法?

scala - 无形状API(在Scala中)的重要功能是什么,它们做什么?

scala - 获取密封特征的子类

scala - 功能等同于并发多映射

scala - 具有可变泛型的元素映射

scala - Chisel IO 接口(interface)构造函数中克隆方法的使用

java - 可以使用 jcodemodel 修改现有的类文件

objective-c - @private 是如何实现的?

scala - 从案例类中过滤出一个字段