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

泛型 – 关联参数化类型

发布时间: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)
    }
  }
}

这几乎是完美的,除了我不确定如何添加边界.

(编辑:李大同)

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

    推荐文章
      热点阅读