作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
给定以下类模式匹配:
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 的类型系统利用到了极限。
关于scala - 与泛型匹配的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5365787/
我是一名优秀的程序员,十分优秀!