gpt4 book ai didi

scala - 使用 scala Type 设置类型参数(通过 TypeTag?)

转载 作者:行者123 更新时间:2023-12-01 09:34:53 25 4
gpt4 key购买 nike

我想动态插入一个类型参数,即 List[T],其中 T 只能在运行时找到。

如果您已经有一个现有的类型参数 T(不是这种情况),或者在运行时使用 TypeTags,通常您可以像这样创建绑定(bind)。

后者听起来像是要走的路,但这将问题转移到“我如何在此处获取我的 TypeTag”。

如果你有类型 T (typeTag[T]),或者如果你有类型 的实例,我知道如何创建一个 TypeTag T(参见下面的 getTypeTag)。

然而,我两者都没有;我有问题的类型是 reflect.runtime.universe.Type。是否可以将其转换为 TypeTag,以便我可以动态插入我的类型参数?

如果 List 也可以动态化,则加分。

scala> import scala.reflect.runtime.{universe => ru}

scala> def getTypeTag[T: ru.TypeTag](obj: T) = ru.typeTag[T]

scala> def insertTag[T](tt: ru.TypeTag[T]) = List[T]_

scala> val fn = (a: String) => "foo"
fn: String => String = <function1>

scala> val pars = getTypeTag(fn).tpe.typeArgs.init(0)
pars: reflect.runtime.universe.Type = String

scala> insertTag(pars)
<console>:21: error: type mismatch;
found : reflect.runtime.universe.Type
required: reflect.runtime.universe.TypeTag[?]
insertTag(pars)
^

最佳答案

我还没有弄清楚如何将 Type 转换为 TypeTag。如果您的目标只是为函数参数获取 TypeTag,您可以修改函数 getTypeTag 以接受函数:

import scala.reflect.runtime.{universe => ru}
def getTypeTag[T: ru.TypeTag](obj: (T) => Any) = ru.typeTag[T]
def insertTag[T](tt: ru.TypeTag[T]) = List[T] _

val fn = (a: String, b: Int) => "foo"
var parTypeTag = getTypeTag(fn.tupled)
insertTag(parTypeTag) // Seq[(String, Int)] => List[(String, Int)] = <function1>

关于scala - 使用 scala Type 设置类型参数(通过 TypeTag?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32422667/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com