На этот вопрос как бы ответил Роланд Кун в этом post, однако, несмотря на несколько комментариев с просьбами о деталях, он не удосужился поделиться полным ответом.
Вот что я хочу сделать: у меня есть класс-оболочка case class Event[T](t: T)
, экземпляры которого я отправляю актеру Akka. Затем в методе receive
этого актера я хочу различать Event[Int]
и Event[String]
, что, очевидно, не так просто из-за стирания типов.
Роланд Кун делится в упомянутом посте тем, что «есть ровно один способ сделать это», то есть включение информации о типе в сообщение. Итак, я сделал это:
case class Event[T](t: T)(implicit val ct: ClassTag[T])
Несмотря на то, что разные люди просили предоставить его, Роланд Кун не говорит, что на самом деле делать в методе receive
. Вот что я пробовал.
def receive = {
case e: Event =>
if (e.ct.runtimeClass == classOf[Int])
println("Got an Event[Int]!")
else if (e.ct.runtimeClass == classOf[String])
println("Got an Event[String]!")
else
println("Got some other Event!")
case _ =>
println("Got no Event at all!")
}
Это лучшее, что я смог придумать, так как сложно разобраться в джунглях отражений Scala. Однако он не компилируется:
value ct is not a member of Any
else if (e.ct.runtimeClass == classOf[String])
^
Таким образом, я спрашиваю конкретно о том, как должен выглядеть метод receive
.
ClassTag
напрямую:e.ct == ClassTag.Int
иe.ct == classTag[String]
). В сообщении об ошибке у вас естьs.ct
, которого нет в коде. - person Alexey Romanov   schedule 13.11.2016e.ct
. Я упростил приведенный выше код, чтобы он был автономным в этом посте. Однако сообщение об ошибке я скопировал из реального кода. Хороший улов, спасибо! - person lkbaerenfaenger   schedule 13.11.2016case e: Event[_]
. После этого компилируется: scastie.org/23724. - person Alexey Romanov   schedule 13.11.2016Event[T : ClassTag]
в этом случае. Кроме того, какой будетString
версияClassTag.Int
? Спасибо большое, Алексей! - person lkbaerenfaenger   schedule 13.11.2016T: ClassTag
в этом случае (ну, вы можете, но в итоге получается более многословно).classTag[String]
являетсяString
версиейClassTag.Int
. - person Alexey Romanov   schedule 13.11.2016