scala getClass和类型擦除?

时间:2014-07-22 06:16:03

标签: scala types erasure

在泛型类型的情况下,我对getClass方法感到有些困惑:

def a[K](key: K) = {
  println(key.getClass)
}

这不应该是AnyRef或Any或者什么东西吗?由于K类信息在运行时不可用吗?

a(3)将输出Inta("fdasf")将输出String.


好吧,这是一个愚蠢的问题,我对K和关键字类型的信息感到困惑。

2 个答案:

答案 0 :(得分:2)

在编译时,编译器不知道K的类型,在运行时,您总是传入特定类型的对象。每个对象都知道它是什么类型。当您调用getClass时,您正在调用该对象上的方法,因此您将返回其实际类型。

答案 1 :(得分:1)

在运行时a(3)a传递的值为3,现在如果编译器检查其值的类型,那么它的返回值为Integer

scala>   def a[K](key: K) = {
     |   println(key.getClass)
     |   }
a: [K](key: K)Unit

scala> a(3)
class java.lang.Integer

scala> a("34")
class java.lang.String

scala> a(34.34)
class java.lang.Double