gpt4 book ai didi

scala - Scala 的 OptManifest 和 NoManifest 有什么用?

转载 作者:行者123 更新时间:2023-12-04 15:01:39 25 4
gpt4 key购买 nike

我正在学习 Scala 的 list 概念,并且对如何在一些简单的情况下使用它有了基本的了解。让我困惑的是什么是OptNanifestNoManifest为了?我从来没见过然后用过。有人可以举例说明他们需要/有用的地方吗?

(我看到 Scala 2.10 用 Manifest 替换了 TypeTags s 的概念,但直到 2.10 是最终版本,我们必须使用 Manifest s。)

最佳答案

假设我们有以下案例类和类型别名:

scala> case class Foo[A](a: A)
defined class Foo

scala> type F = Foo[_]
defined type alias F

我们现在可以(不是很有用)列出 F 类型的东西:
scala> val foos: List[F] = List(Foo(1), Foo("a"), Foo('a))
foos: List[F] = List(Foo(1), Foo(a), Foo('a))

我们可以把它变成一个数组:
scala> foos.toArray
res0: Array[F] = Array(Foo(1), Foo(a), Foo('a))

很明显,编译器能够找到它需要的 list 作为 toArray 的隐式参数。方法在 List .但是如果我们要一个普通的旧 ManifestF ,我们得到一个错误:
scala> manifest[F]
<console>:11: error: overloaded method value classType with alternatives:
(prefix: scala.reflect.Manifest[_],clazz: Class[_],args: scala.reflect.Manifest[_]*)scala.reflect.Manifest[F] <and>
(clazz: Class[F],arg1: scala.reflect.Manifest[_],args: scala.reflect.Manifest[_]*)scala.reflect.Manifest[F] <and>
(clazz: Class[_])scala.reflect.Manifest[F]
cannot be applied to (java.lang.Class[Foo[_$1]], scala.reflect.Manifest[_$1])
manifest[F]

所以很明显,编译器在使用 list 来表示我们的类型别名中的通配符时遇到了麻烦。

原因 toArray有效的是它期望一个 ClassManifest ,不仅仅是 Manifest .事实上我们可以得到一个 ClassManifestF没有问题,正是因为 ClassManifest用途 OptManifest表示它的类型参数——不像 Manifest ,其类型参数只是 Manifest 类型的其他东西.
scala> classManifest[F]
res2: ClassManifest[F] = Foo[<?>]

那个 <?>NoManifest 的字符串表示.它的作用是 None在这里,允许编译器表示关于类型 F 的类信息(幸运的是,这就是我们创建数组所需要的全部内容),无需提及 F 的类型参数。除了“不,我无法建模”。

关于scala - Scala 的 OptManifest 和 NoManifest 有什么用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12651542/

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