【问题标题】:scala getClass and type erasure?scala getClass和类型擦除?
【发布时间】: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 的类型信息弄糊涂了。

【问题讨论】:

    标签: scala types erasure


    【解决方案1】:

    虽然在编译时编译器不知道K 的类型,但在运行时你总是传入一个特定类型的对象。每个对象都知道它是什么类型。当你调用getClass 时,你调用的是对象的一个​​方法,所以你得到了它的实际类型。

    【讨论】:

      【解决方案2】:

      在运行时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
      

      【讨论】:

      • 好吧,你是对的,我似乎对 K 型的用法感到困惑。 k不带detail type信息,key带?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-30
      • 2012-05-28
      • 1970-01-01
      • 2020-07-27
      • 2012-08-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多