Вопрос 1:
JVM не знает о генериках, поэтому параметры типа в Scala (и Java) существуют только во время компиляции. Они не существуют во время выполнения. Поскольку Akka является фреймворком Scala (и Java), он тоже страдает от этого самого недостатка. Это страдает, в частности, потому что в Акке сообщения между участниками (очевидно) обмениваются только во время выполнения, поэтому все аргументы типа этих сообщений теряются. До сих пор?
Вопрос 2:
Скажем, я определил следующий класс case, который принимает один параметр типа:
case class Event[T](t: T)
Теперь я создаю экземпляр Event[Int](42)
и отправлю его на мой testActor
. Правильно ли, что мой testActor
в основном получает Event[Any]
и не знает, какой тип t
?
Вопрос 3:
Скажем, внутри my testActor
существует функция, которая также принимает параметр типа:
def f[T](t: T) = println(t)
testActor
вызывает f
при приеме Event
:
override def receive: Receive = {
case Event(t) => f(t)
}
К чему будет задан параметр типа t
of f
, когда функция вызывается так? Any
? Если это так, будет ли следующая функция эффективно эквивалентна предыдущей (предполагается, что она будет вызвана так, как описано выше):
def f2(t: Any) = println(t)
Вопрос 4:
Теперь рассмотрим это определение f
:
def f[T](t: T) = println(t.getClass)
Я не менял сайт:
override def receive: Receive = {
case Event(t) => f(t)
}
Не следует ли всегда печатать Any
на консоли? Когда я отправляю Event[Int](42)
на мой testActor
, он печатает java.lang.Integer
на консоли. Таким образом, информация о типе не стирается в конце концов? Я смущен.