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

更新到Scala 2.10时清单/类型标记出现问题

发布时间:2020-12-16 10:04:12 所属栏目:安全 来源:网络整理
导读:我坐在一个大约10000 LoC的项目前.我必须将此项目从 Scala 2.9更新到2.10.这样做得很好,但由于清单,我收到了许多弃用警告. ? 在使用stackoverflow和许多其他站点的搜索功能之后,我没有那么多问题.我想总结一下;关键点是: TypeTags和ClassTag比Manifest和Cla
我坐在一个大约10000 LoC的项目前.我必须将此项目从 Scala 2.9更新到2.10.这样做得很好,但由于清单,我收到了许多弃用警告.
?
在使用stackoverflow和许多其他站点的搜索功能之后,我没有那么多问题.我想总结一下;关键点是:

> TypeTags和ClassTag比Manifest和ClassManifest好得多.特别是你可以将它们用作同义词(TypeTags< - > Manifest和ClassTags< - > ClassManifest)
> TypeTag比ClassTag更强大,ClassTag更受限制TypeTags.我的第一个问题:在这个项目中,经常使用方法manifest [T] .erasure.getSimpleName.现在我不仅可以将它切换到typeTag [T] .runtimeClass.getSimpleName,因为代码不会编译,但是使用classTag [T] .runtimeClass.getSimpleName它会编译.这会影响语义吗? (注意:方法擦除也已弃用;您必须使用runtimeClass)
>第二个问题:Scala 2.9中清单的类型检查有点:manifest [T]<:<清单[A].在Scala 2.10中,我会写这个typeOf [T]<:< TYPEOF [A].但是<:<不推荐使用?!
>我能够将TypeTag转换为ClassTag吗? I.e.:如果我只使用清单进行类型检查(Nr.3)和名称提取(Nr.2):我能将每个Manifest / ClassManifest重命名为ClassTag吗?

解决方法

>是的,你大多数都有等价的TypeTag< - > Manifest和ClassTag< - > ClassManifest.除了有些东西过去由Manifest处理,没有直接的等价物,因为这些操作被深入到反射API中,就像Manifest对象上的工厂方法一样.
> ClassTag现在基本上只用于获取运行时(擦除)类的东西.它主要用于创建数组,但您可以毫无问题地将其用于其他目的.所以是的,classTag [T] .runtimeClass是新的清单[T] .erasure并且完全等同于它.
>这是变化最大的地方. 2.10引入了 new reflection API,当你想回答关于类型的具体问题时你应该使用它(比如“A<:< B?”).而类型的反射API的入口点是......它的TypeTag. 假设A和T的类型标签在范围内,则新清单[T]<:< manifest [A]确实是typeOf [T]<:< TYPEOF [A].方法<:<这里没有弃用,see the scaladoc.但是有一个弃用的<:<在ClassTag中,因为ClassManifest曾经有一个,而ClassTag是新的ClassManifest. 请参阅反射指南的 Common Operations on Types部分和SO问题 What is a TypeTag and how do I use it.
>我认为没有直接的方法可以从TypeTag转到ClassTag.想一想:

>如果你需要子类型或类型相等检查,你不能使用ClassTag,你需要一个TypeTag;
>如果您还需要该类型的名称,您可以从TypeTag获取它:typeOf [T] .typeSymbol.name.decoded.这将为您提供已擦除的名称,就像您以前获取的类名(List for List [Int]或Map for Map [String,Int])一样.这与获取实际Class的名称略有不同.如果你需要全部未擦除的名称(List [Int]),typeOf [T] .normalize.toString就足够了.
>如果你也绝对需要一个Class实例,或者你可以传递并通过反射加载的真实类名,我认为你别无选择,但也要求ClassTag.

编辑:我刚刚找到this SO question,所以是的,可以从TypeTag获得ClassTag.遗憾的是,反射库中没有任何辅助方法.

编辑2:根据要求,以下是如何从TypeTag转换为ClassTag:

import reflect.runtime.universe._
import reflect.ClassTag

def classTag2[T: TypeTag]: ClassTag[T] = {
  ClassTag[T]( typeTag[T].mirror.runtimeClass( typeTag[T].tpe ) )
}

// example:

def doSomething[T : TypeTag] = {
  val c = classTag2[T]
  c.runtimeClass.getName
}

(编辑:李大同)

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

    推荐文章
      热点阅读