【发布时间】:2017-01-27 23:27:09
【问题描述】:
问题 1:
JVM 不知道泛型,因此 Scala(和 Java)中的类型参数仅在编译时存在。它们在运行时不存在。由于 Akka 是一个 Scala(和 Java)框架,它也有这个缺点。它尤其受此影响,因为在 Akka 中,actor 之间的消息(显然)仅在运行时交换,因此这些消息的所有类型参数都丢失了。到目前为止正确吗?
问题 2:
假设我定义了以下采用一个类型参数的案例类:
case class Event[T](t: T)
现在,我实例化一个Event[Int](42) 并将其发送到我的testActor。我的testActor 基本上收到Event[Any] 并且不知道t 是什么类型,这对吗?
问题 3:
比方说,在我的testActor 中存在一个也接受类型参数的函数:
def f[T](t: T) = println(t)
testActor 在收到Event 时调用f:
override def receive: Receive = {
case Event(t) => f(t)
}
这样调用函数时f的类型参数T会设置成什么? 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 打印到控制台。所以类型信息毕竟没有被删除?我很困惑。
【问题讨论】:
标签: java scala jvm akka type-erasure