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

scala – 与泛型匹配的模式

发布时间:2020-12-16 09:05:12 所属栏目:安全 来源:网络整理
导读:给定以下类模式匹配: clazz match { case MyClass = someMethod[MyClass]} 是否可以根据模式匹配的内容以通用方式引用MyClass?例如,如果我有MyClass的多个子类,我可以编写一个简单的模式匹配来将匹配的类型传递给someMethod: clazz match { case m : MyCl
给定以下类模式匹配:

clazz match {
  case MyClass => someMethod[MyClass]
}

是否可以根据模式匹配的内容以通用方式引用MyClass?例如,如果我有MyClass的多个子类,我可以编写一个简单的模式匹配来将匹配的类型传递给someMethod:

clazz match {
  case m <: MyClass => someMethod[m]
}

解决方法

不幸的是,类型并不是Scala中真正的一等公民.这意味着您无法对类型进行模式匹配.由于从Java平台继承的愚蠢类型擦除,丢失了大量信息.

我不知道是否有任何改进请求,但这是我选择中最严重的问题之一,所以有人应该提出这样的请求.

事实上,你需要传递证据参数,最好是以隐式参数的形式.

我能想到的最好的就是

class PayLoad

trait LowPriMaybeCarry {
   implicit def no[C] = new NoCarry[C]
}
object MaybeCarry extends LowPriMaybeCarry {
   implicit def canCarry[C <: PayLoad](c: C) = new Carry[C]
}

sealed trait MaybeCarry[C]
final class NoCarry[C] extends MaybeCarry[C]
final class Carry[C <: PayLoad] extends MaybeCarry[C] {
   type C <: PayLoad
}

class SomeClass[C <: PayLoad]

def test[C]( implicit mc: MaybeCarry[C]) : Option[SomeClass[_]] = mc match {
   case c: Carry[_] => Some(new SomeClass[ c.C ])
   case _ => None
}

但我仍然无法得到隐含的工作:

test[String]
test[PayLoad]  // ouch,not doin it
test[PayLoad](new Carry[PayLoad])  // sucks

因此,如果你想保存自己的严重脑损伤,我会忘记该项目或寻找另一种语言.也许Haskell在这里更好?我仍然希望我们最终可以匹配类型,但我的希望非常低.

也许来自scalaz的人提出了一个解决方案,他们几乎利用Scala的类型系统达到极限.

(编辑:李大同)

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

    推荐文章
      热点阅读