【发布时间】:2014-07-22 15:06:25
【问题描述】:
getClass 方法用在泛型案例中时,我有点疑惑:
def a[K](key: K) = {
println(key.getClass)
}
这不应该一直是 AnyRef 或 Any 之类的吗?由于 K 型信息在运行时不可用?
但 a(3) 将输出 Int ,而 a("fdasf") 将输出 String.
好吧,这是一个愚蠢的问题,我被 K 和 key 的类型信息弄糊涂了。
【问题讨论】:
getClass 方法用在泛型案例中时,我有点疑惑:
def a[K](key: K) = {
println(key.getClass)
}
这不应该一直是 AnyRef 或 Any 之类的吗?由于 K 型信息在运行时不可用?
但 a(3) 将输出 Int ,而 a("fdasf") 将输出 String.
好吧,这是一个愚蠢的问题,我被 K 和 key 的类型信息弄糊涂了。
【问题讨论】:
虽然在编译时编译器不知道K 的类型,但在运行时你总是传入一个特定类型的对象。每个对象都知道它是什么类型。当你调用getClass 时,你调用的是对象的一个方法,所以你得到了它的实际类型。
【讨论】:
在运行时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
【讨论】: