Этот вопрос был подтвержден Роланд Куном в этом post, однако, несмотря на несколько комментариев с просьбой о подробностях, он не удосужился поделиться полным ответом.Сохраняемые аргументы типа в Akka получают
Вот что я хочу сделать: у меня есть класс-обертка case class Event[T](t: T)
, из которого я отправляю экземпляры актеру Акка. В методе 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!")
}
Это лучшее, что я мог придумать, как это трудно, чтобы обернуть свою голову вокруг отражения джунглей Скала. Это не компиляции, хотя:
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', который отсутствует в коде. –
Изменено на 'e.ct'. Я упростил приведенный выше код, чтобы быть автономным в этом сообщении. Однако сообщение об ошибке, которое я скопировал из реального кода. Хороший улов, спасибо! – lambdarookie
Вам также нужно исправить 'case e: Event [_]'. После этого он компилируется: http://scastie.org/23724. –