scala getClass和类型擦除?
在泛型类型中使用getClass方法时,我有点困惑:scala getClass和类型擦除?,scala,types,erasure,Scala,Types,Erasure,在泛型类型中使用getClass方法时,我有点困惑: def a[K](key: K) = { println(key.getClass) } 这不应该一直是任何参考或任何东西吗?因为类型K信息在运行时不可用 但是a(3)将输出Int,而a(“fdasf”)将输出字符串。 好吧,这是一个愚蠢的问题,我被K和键的类型信息弄糊涂了。在运行时a(3)传递给a的值是3,现在如果编译器检查其值的类型,那么它当然返回整数 scala> def a[K](key: K) = { |
def a[K](key: K) = {
println(key.getClass)
}
这不应该一直是任何参考或任何东西吗?因为类型K信息在运行时不可用
但是a(3)
将输出Int
,而a(“fdasf”)
将输出字符串。
好吧,这是一个愚蠢的问题,我被K和键的类型信息弄糊涂了。在运行时
a(3)
传递给a的值是3
,现在如果编译器检查其值的类型,那么它当然返回整数
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
在运行时a(3)
传递给a
的值是3
,现在如果编译器检查其值的类型,那么它当然返回整数
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
在运行时a(3)
传递给a
的值是3
,现在如果编译器检查其值的类型,那么它当然返回整数
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
在运行时a(3)
传递给a
的值是3
,现在如果编译器检查其值的类型,那么它当然返回整数
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
虽然编译器在编译时不知道K
的类型,但在运行时总是传入特定类型的对象。每个物体都知道它是什么类型的。当您调用getClass
时,您正在调用对象上的一个方法,因此您将返回其实际类型。当编译器在编译时不知道K
的类型时,在运行时您总是传入一个特定类型的对象。每个物体都知道它是什么类型的。当您调用getClass
时,您正在调用对象上的一个方法,因此您将返回其实际类型。当编译器在编译时不知道K
的类型时,在运行时您总是传入一个特定类型的对象。每个物体都知道它是什么类型的。当您调用getClass
时,您正在调用对象上的一个方法,因此您将返回其实际类型。当编译器在编译时不知道K
的类型时,在运行时您总是传入一个特定类型的对象。每个物体都知道它是什么类型的。当你调用getClass
时,你调用的是对象上的一个方法,因此你得到了它的实际类型。好吧,你是对的,我似乎对类型K的用法感到困惑。K不携带详细的类型信息,而key携带?好吧,你是对的,似乎我对K的用法感到困惑。K不携带详细的类型信息,而key携带?好吧,你是对的,似乎我对K的用法感到困惑。K不携带详细的类型信息,而key携带?好吧,你是对的,似乎我对K的用法感到困惑。K不携带详细信息类型信息,而key携带?