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

Scala中Map键和值类型参数之间的依赖关系

发布时间:2020-12-16 08:43:22 所属栏目:安全 来源:网络整理
导读:参见英文答案 Relating parameterized types????????????????????????????????????4个 有时,对映射中的键类型和值之间的依赖关系进行编码可能很有用.请考虑以下类型: type MyPairs = Seq[(TypeTag[T],T) forSome {type T}] 这里序列中的每一对都应该具有相
参见英文答案 > Relating parameterized types????????????????????????????????????4个
有时,对映射中的键类型和值之间的依赖关系进行编码可能很有用.请考虑以下类型:

type MyPairs = Seq[(TypeTag[T],T) forSome {type T}]

这里序列中的每一对都应该具有相同的类型T.但是这种类型在类似地图的用法方面不是很方便.但是我无法表达Map [K,V]的依赖性,因为Map有两个独立的类型参数,似乎我不能以任何方式“组合”它们以使用单个存在类型.天真的变种

type MyMap = Map[TypeTag[T],T] forSome {type T}

只强制所有MyMap条目的单一类型T.但不单独为每一个.

我认为另一个极端是

type MyMap = Map[TypeTag[_],_]

但是,这当然是一个过于宽泛的定义,它允许任何键值类型的组合.

所以我的问题是,可以在Scala中编码这样的类型吗?如果有,怎么样?

解决方法

正如其他人指出的那样,您需要使用异质地图.无形项目有一个实现:

https://github.com/milessabin/shapeless/wiki/Feature-overview:-shapeless-1.2.4#heterogenous-maps

这允许你这样做:

import shapeless._
class Constrainer[K,V]
implicit def allowed[T] = new Constrainer[Class[T],T]
val hmap = HMap[Constrainer](classOf[String] -> "Hi there",classOf[Int] -> 3) // this compiles
val hmapFail = HMap[Constrainer](classOf[String] -> 3) // this won't compile

对于使用TypeTag的具体示例:

import shapeless._
import scala.reflect.runtime.universe._
class Constrainer[K,V]
implicit def allowed[T] = new Constrainer[TypeTag[T],T]
val hmap = HMap[Constrainer](typeTag[String] -> "hello",typeTag[Int] -> 2) // this compiles
val hmapFail = HMap[Constrainer](typeTag[String] -> 3) // this won't compile

请注意,您可以使用隐式值(或我们的情况下的转换)来指定允许的(键,值)对的实例.

(编辑:李大同)

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

    推荐文章
      热点阅读