在 Scala 中使用 ClassManifest 从 Any 转换值

发布于 2024-10-06 02:34:41 字数 213 浏览 5 评论 0原文

我有一个值的 List[Any] 和相应的 ClassManifest[_] 列表,用于存储值的原始类型。如何将列表中的某些值转换回其原始类型?

defcast[T](x: Any, mf: ClassManifest[T]): T = x.asInstanceOf[T] 不起作用。

谢谢您的回答。

I've got a List[Any] of values and a list of corresponding ClassManifest[_]s, storing values' original types. How do i cast some value from list back to it's original type?

def cast[T](x: Any, mf: ClassManifest[T]): T = x.asInstanceOf[T] doesn't work.

Thank You for your answers.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

英雄似剑 2024-10-13 02:34:41

这是不可能的,因为 cast 的返回类型将始终被视为 T 所限制的最高通用超类型。无法在编译时使其变得更加具体。

如果您尝试构建不同类型的强类型集合,那么您真正想要的是 HList:

http://jnordenberg.blogspot.com/2008/09/hlist-in-scala-revisited-or-scala.html

That can't ever possibly work, as the return type of cast will always be taken as the highest common supertype of whatever T is restricted to. There's no way it can be made any more specific at compile time.

If you're trying to build a strongly-typed collection of disparate types, then what you really want is an HList:

http://jnordenberg.blogspot.com/2008/09/hlist-in-scala-revisited-or-scala.html

若无相欠,怎会相见 2024-10-13 02:34:41

在 Java/Scala 中使用 Class 实例来转换对象的方法是使用 Class.cast 方法。所以你可能认为你可以这样做:

mf.erasure.cast(x) //T

但这是行不通的,因为 mf.erasure 是一个 Class[_] (或一个 Class in Java),因此强制转换毫无意义(即不提供额外信息)。 (当然)这是使用非具体化泛型的缺点之一。

The way to use a Class instance in Java/Scala to cast an object is to use the Class.cast method. So you may think that you could do:

mf.erasure.cast(x) //T

But this will not work, because mf.erasure is a Class[_] (or a Class<?> in Java), so the cast is meaningless (i.e. offers no extra information). This is (of course) one of the drawbacks in using non-reified generics.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文