У меня есть следующие определения:
trait Xode[+R] {
type S = Option[R]
}
case class AXode(a: Int) extends Xode[Int]
case class BXode(b: String) extends Xode[String]
object xtore {
private var m: Map[Xode[_], Xode[_]#S] = Map()
def put[A <: Xode[_]](k: A)(v: A#S) {
m += k -> v
}
}
При выполнении следующего ошибка не возникает, хотя я ожидаю, что AXode # S будет Option [Int].
xtore.put(AXode(5))(Some("apples")) // <-- no error
Может случиться так, что A
будет Xode[_]
, а затем Xode[_]#S
будет Option[_]
.Могу ли я выразить свое намерение с помощью параметров типа?
При реализации с использованием R, являющегося абстрактным членом типа вместо параметра типа, он работает, как и ожидалось.Или зависимые типы методов и набор v: k.S
также помогает.Есть ли другая конструкция?