作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在学习 Scala 的 list 概念,并且对如何在一些简单的情况下使用它有了基本的了解。让我困惑的是什么是OptNanifest
和 NoManifest
为了?我从来没见过然后用过。有人可以举例说明他们需要/有用的地方吗?
(我看到 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))
toArray
的隐式参数。方法在
List
.但是如果我们要一个普通的旧
Manifest
为
F
,我们得到一个错误:
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]
toArray
有效的是它期望一个
ClassManifest
,不仅仅是
Manifest
.事实上我们可以得到一个
ClassManifest
为
F
没有问题,正是因为
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/
我正在学习 Scala 的 list 概念,并且对如何在一些简单的情况下使用它有了基本的了解。让我困惑的是什么是OptNanifest和 NoManifest为了?我从来没见过然后用过。有人可以举例说
我是一名优秀的程序员,十分优秀!