泛型 – 关联参数化类型
发布时间:2020-12-16 09:25:50 所属栏目:安全 来源:网络整理
导读:我有一个地图,其中键和值都是泛型类型.像这样的东西: Map[Foo[A],Bar[A]] 我想表达的是,对于地图中的每个键值对,类型A可能不同,但每个键的参数化始终与它映射到的值的类型相同.所以Foo [Int]总是映射到Bar [Int],Foo [String]总是映射到Bar [String],依此类
我有一个地图,其中键和值都是泛型类型.像这样的东西:
Map[Foo[A],Bar[A]] 我想表达的是,对于地图中的每个键值对,类型A可能不同,但每个键的参数化始终与它映射到的值的类型相同.所以Foo [Int]总是映射到Bar [Int],Foo [String]总是映射到Bar [String],依此类推. 有谁知道表达这种方式的方法? 编辑: 这是我正在尝试做的事情的一个例子: trait Parameter // not important what it actually does class Example { val handlers: Map[_ <: Parameter,(_ <: Parameter) => _] = Map() def doSomething() { for ((value,handler) <- handlers) { handler(value) } } } 我们的想法是一个值总是映射到一个可以接受它作为参数的函数,但是现在编写代码时,编译器无法知道这一点. 解决方法
事实证明,可以在Scala中定义异构映射.这是一个粗略的草图:
class HMap[A[_],B[_]] extends Iterable[HMap.Mapping[A,B,_]] { private val self = mutable.Map[A[_],B[_]]() def toMapping[T](a: A[_],b: B[_]): HMap.Mapping[A,T] = { HMap.Mapping(a.asInstanceOf[A[T]],b.asInstanceOf[B[T]]) } def iterator: Iterator[HMap.Mapping[A,_]] = new Iterator[HMap.Mapping[A,_]] { val sub = self.iterator def hasNext = sub.hasNext def next(): HMap.Mapping[A,_] = { val (key,value) = sub.next() toMapping(key,value) } } def update[T](key: A[T],value: B[T]) = (self(key) = value) def get[T](key: A[T]) = self.get(key).asInstanceOf[Option[B[T]]] def apply[T](key: A[T]) = self(key).asInstanceOf[B[T]] } object HMap { case class Mapping[A[_],B[_],T](val key: A[T],val value: B[T]) } 通过内部使用映射的链接列表而不是映射,可以使这完全类型安全,但这对于性能更好. 我原来的例子看起来像这样: object Example { type Identity[T] = T type Handler[T] = (T) => _ val handlers = new HMap[Identity,Handler] def doSomething() { for (HMap.Mapping(value,handler) <- handlers) { handler(value) } } } 这几乎是完美的,除了我不确定如何添加边界. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |