К сожалению, в Скале типы не являются первоклассными гражданами.Это означает, например, что вы не можете выполнять сопоставление с образцом для типов.Большая часть информации теряется из-за глупого стирания типа, унаследованного от платформы 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
Так что, если вы хотите уберечь себя от серьезного повреждения мозга, я бы забыл опроект или искать другой язык.Может, Хаскел лучше здесь?Я все еще надеюсь, что мы в конечном итоге сможем сопоставлять типы, но мои надежды довольно низки.
Может быть, ребята из scalaz придумали решение, они в значительной степени использовали систему типов Scala до предела.