加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

什么是Scala的OptManifest和NoManifest?

发布时间:2020-12-16 18:55:12 所属栏目:安全 来源:网络整理
导读:我正在学习 Scala的清单概念,我对如何在一些简单的情况下使用它有一个基本的了解.令我困惑的是什么是OptNanifest和NoManifest?我以前从未见过用过.有人可以举一个他们需要/有用的例子吗? (我看到Scala 2.10用TypeTags取代了Manifest的概念,但直到2.10才最
我正在学习 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模型“.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读