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

scala中的擦除消除:非变量类型参数未选中,因为它被擦除消除

发布时间:2020-12-16 09:48:52 所属栏目:安全 来源:网络整理
导读:我有一个序列Seq [任何]有各种各样的对象(如String,Integer,List [String]等)。我试图筛选列表,并将其拆分成基于类类型分区的单独列表。以下是我在代码中使用的模式: val allApis = mySequence.filter(_.isInstanceOf[String]) 这工作得很好,不会生成任
我有一个序列Seq [任何]有各种各样的对象(如String,Integer,List [String]等)。我试图筛选列表,并将其拆分成基于类类型分区的单独列表。以下是我在代码中使用的模式:

val allApis = mySequence.filter(_.isInstanceOf[String])

这工作得很好,不会生成任何警告。但是,当我尝试做同样的过滤出的对象列表的字符串:

val allApis = mySequence.filter(_.isInstanceOf[List[String]])

我得到一个警告说,类型List [String]中的非变量类型参数字符串未被选中,因为它被擦除消除。现在,该技术实际上工作,我能够舒适地过滤序列,如所期望的,但我想知道什么是适当的方式处理警告以惯用的方式,所以我知道我没有一个严重的错误潜伏在背景等待炸毁

解决方法

它不工作,因为它会选择List [Double]或任何其他列表除了List [String]。有各种各样的方法来解决这个问题,包括在非参数化的case类中包装任何参数化的类型:

case class StringList(value: List[String])

然后你可以只是

mySequence.collect{ case StringList(xs) => xs }

拉出字符串列表(具有正确的类型,并且类型安全地)。

或者,如果您不想包装对象,并想确保它们是正确的类型,您可以检查每个元素:

mySequence.filter( _ match {
  case xs: List[_] => xs.forall( _ match { case _: String => true; case _ => false })
  case _ => false
})

虽然这不会让你知道哪些类型的空列表应该是。

另一种可能是将TypeTag粘贴到列表中的所有内容;这将防止你需要手动包装东西。例如:

import scala.reflect.runtime.universe.{TypeTag,typeTag}
def add[A](xs: List[(Any,TypeTag[_])],a: A)(implicit tt: TypeTag[A]) = (a,tt) :: xs
val mySequence = add(add(add(Nil,List(42)),true),List("fish"))
mySequence.filter(_._2.tpe weak_<:< typeTag[List[String]].tpe)

(编辑:李大同)

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

    推荐文章
      热点阅读