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

scala – 从Class [T]映射到T而不进行强制转换

发布时间:2020-12-16 09:25:24 所属栏目:安全 来源:网络整理
导读:我想从类标记映射到以下代码行的实例: trait Instances { def put[T](key: Class[T],value: T) def get[T](key: Class[T]): T} 这可以在不必解析get方法中的强制转换的情况下完成吗? 更新: 对于一些Foo [T]而不是Class [T]的更一般情况,怎么办呢? 解决方
我想从类标记映射到以下代码行的实例:

trait Instances {
  def put[T](key: Class[T],value: T)
  def get[T](key: Class[T]): T
}

这可以在不必解析get方法中的强制转换的情况下完成吗?

更新:

对于一些Foo [T]而不是Class [T]的更一般情况,怎么办呢?

解决方法

如果你想在没有任何强制转换的情况下执行此操作(即使在get中),那么您将需要编写异构映射.由于显而易见的原因,这很棘手. :-)最简单的方法可能是使用类似HList的结构并构建一个find函数.但是,这并不简单,因为您需要定义一些检查两种任意类型的类型相等的方法.

我试图让元组和存在类型变得有点棘手.但是,Scala不提供统一机制(模式匹配不起作用).此外,子类型将整个事物绑在一起,基本上消除了它可能提供的任何安全性:

val xs: List[(Class[A],A) forSome { type A }] = List(
  classOf[String] -> "foo",classOf[Int] -> 42)

val search = classOf[String]
val finalResult = xs collect { case (`search`,result) => result } headOption

在此示例中,finalResult将为Any类型.这实际上是正确的,因为子类型意味着我们对A没有任何了解.这不是编译器选择该类型的原因,但它是一个正确的选择.举个例子:

val xs: List[(Class[A],A) forSome { type A }] = List(classOf[Boolean] -> 'bippy)

这完全合法!子类型意味着在这种情况下A将被选为任何.这不是我们想要的,但它是你会得到的.因此,为了在不跟踪所有类型(使用HMap)的情况下表达此约束,Scala需要能够表达类型是特定类型的约束而不是其他任何类型.不幸的是,Scala没有这种能力,因此我们基本上停留在通用约束前沿.

更新实际上,这是不合法的.刚试了一下,编译器就把它踢出去了.我认为这只有效,因为Class在其类型参数中是不变的.所以,如果Foo是一个不变的确定类型,那么你应该对这种情况安全.它仍然没有解决统一问题,但至少它是合理的.不幸的是,假设类型构造函数处于共同,反对和不变之间的神奇超级位置,因此如果它真的是任意类型Foo of kind * => *,然后你仍然沉没在存在主义的前线.

总结:它应该是可能的,但前提是您将实例完全编码为HMap.就个人而言,我只会在内部投射得到.更简单!

(编辑:李大同)

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

    推荐文章
      热点阅读