如何根据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? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |