什么是Scala的OptManifest和NoManifest?
我正在学习
Scala的清单概念,我对如何在一些简单的情况下使用它有一个基本的了解.令我困惑的是什么是OptNanifest和NoManifest?我以前从未见过用过.有人可以举一个他们需要/有用的例子吗?
(我看到Scala 2.10用TypeTags取代了Manifest的概念,但直到2.10才最终我们必须使用Manifest.) 解决方法
假设我们有以下case类和类型别名:
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)) 很明显,编译器能够找到它需要的清单作为List上toArray方法的隐式参数.但是如果我们要求一个普通的旧Manf,我们会收到一个错误: 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] 所以很明显,编译器在使用清单来表示我们的类型别名中的通配符时遇到了麻烦. Array工作的原因是它需要一个ClassManifest,而不仅仅是一个Manifest.事实上,我们可以毫无问题地获得F的ClassManifest,正是因为ClassManifest使用OptManifest来表示它的类型参数 – 与Manifest不同,Manifest的类型参数只是Manifest类型的其他东西. scala> classManifest[F] res2: ClassManifest[F] = Foo[<?>] 那<?>是NoManifest的字符串表示.它在这里扮演None的角色,允许编译器表示关于类型F的类信息(这是我们创建数组所需的全部,幸运的是),而没有说任何关于F的类型参数,除了“不,我可以” t模型“. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |