Если вы хотите, чтобы эта версия компилировалась:
def mediaType: String = implicitly[Trait[A]].traitType
тогда неявный экземпляр Trait[A]
должен быть передан, например, когда создается новый экземпляр Media
. Попробуйте определить Media
следующим образом:
class Media[A](implicit private val t: Trait[A]) {
def mediaType: String = t.traitType
}
Почти эквивалентное определение, использующее привязанный к контексту , это:
class Media[A: Trait] {
def mediaType: String = implicitly[Trait[A]].traitType
}
При этом, если вы пытаетесь сохранить больше информации о параметре типа параметризованного типа, вы можете использовать Manifest
s вместо своего собственного механизма. Они предоставят вам полную информацию о типе A
во время выполнения, в том числе, если A
сам по себе является параметризованным типом:
scala> class Media[A](implicit val aManifest: Manifest[A])
defined class Media
scala> new Media[Int].aManifest
res0: Manifest[Int] = Int
scala> new Media[Seq[(Int, String)]].aManifest
res1: Manifest[Seq[(Int, String)]] = scala.collection.Seq[scala.Tuple2[Int, java.lang.String]]