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

如何根据Scala中的类型重复使用?

发布时间:2020-12-16 09:06:17 所属栏目:安全 来源:网络整理
导读:我正在解析包含各种结构的文件,其中一个是具有异构值的映射.将地图解析到内存后,我想根据值类型对其进行过滤,以获取给定类型的子图. 为了交谈,这里有一个简单的类似例子: // the types I want to filter oncase class A(c: Char)case class B(c: Char)// an
我正在解析包含各种结构的文件,其中一个是具有异构值的映射.将地图解析到内存后,我想根据值类型对其进行过滤,以获取给定类型的子图.

为了交谈,这里有一个简单的类似例子:

// the types I want to filter on
case class A(c: Char)
case class B(c: Char)

// an example for testing
val m: Map[Int,Any] = Map((1 -> A('x')),(2 -> B('p')),(3 -> A('y')),(4 -> B('q')))

这是一个将地图过滤到Map [Int,A]的函数:

// a successful filter function based on A
def as(m: Map[Int,Any]): Map[Int,A] =
  for((int,a: A) <- m) yield (int -> a)

你可以想象几乎完全相同的功能“bs”也是成功的,但我不想写.相反,我以为我会写一个通用函数:

// a failed generic filter function
def typeFilter[T](m: Map[Int,T] =
  for((int,t: T) <- m) yield (int -> t)

所以,这是状态:

val aMap: Map[Int,A] = as(m) // works!
val bMap: Map[Int,B] = bs(m) // works!
val aMapGen: Map[Int,A] = typedFilter[A](m) // doesn't work! returns all of m
val bMapGen: Map[Int,B] = typedFilter[B](m) // doesn't work! returns all of m

现在我对此更加严谨,进入这个问题,似乎更加奇怪. Map [Int,A]如何包含B值的映射?它编译为声明的事实似乎意味着它应该正确运行,但是当我打印aMapGen或bMapGen的内容时,我看到m的全部内容,包括具有不兼容类型的值.这是我在Scala中遇到的第一个问题,就像Java中类型擦除的挫折一样.

我希望能解释为什么它的行为本来就如此,但我的主要目标是能够编写一些可重用的代码来根据类型进行过滤.否则,我将不得不为我列表中的所有类型复制/粘贴具有更改类型的函数.

谢谢你的帮助.

解决方法

由于类型擦除,这是失败的. Scala在Java虚拟机上运行,??它没有泛型.因此,有关泛型的信息在运行时不可用,就像在Java中一样.

为了解决这个问题,我建议你参考How do I get around type erasure on Scala? Or,why can’t I get the type parameter of my collections?

(编辑:李大同)

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

    推荐文章
      热点阅读