Хорошо, так что я не знаю, что глючит в этом коде:
import scala.reflect.runtime.universe._
trait Key extends Product
case class SomeKey(a: Int, b: String) extends Key
case class SomeOtherKey(a: Int, b: String, c:Boolean) extends Key
trait MyTrait[T <: Key] {
def someField: Int
def someFunc(implicit tTypeTag: TypeTag[T]): Map[T, Int] = {
typeOf(tTypeTag) match {
case t if t =:= typeOf[SomeKey] => Map(SomeKey(1,"2") -> 1)
case t if t =:= typeOf[SomeOtherKey] => Map(SomeOtherKey(1,"2",true) -> 2)
}
}
}
Я хочу (пример был упрощен), чтобы иметь возможность возвращать Map[SomeKey, Int]
, если someFunc
вызывается из класс case, расширяющий MyTrait[SomeKey]
. И вернуть Map[SomeOtherKey, Int]
из MyTrait[SomeOtherKey]
case class MyClass(val s: Int) extends MyTrait[SomeKey] {
override def someField = s
}
Здесь новый экземпляр MyClass
должен возвращать Map[SomeKey, Int]
при вызове someFunc
.
Но это не так даже компиляция, компилятор жалуется на каждую строку совпадения шаблона:
type mismatch;
found : (Playground.this.SomeKey, Int)
required: (T, Int)
или
type mismatch;
found : (Playground.this.SomeOtherKey, Int)
required: (T, Int)