Scala:为什么修复类型成员创建Java子类



每当class

class X {
 type T
}

在修复类型成员时是实例化的,创建了新的Java类:

scala> new X() { type T = Int }.getClass.hashCode
res5: Int = 2033908791
scala> new X() { type T = Int }.getClass.hashCode
res6: Int = 1820034148

但是,当使用工厂时

object X {
  def apply[TP] = new X { type T = TP }
}

然后,单个Java类能够表示所有可能的实例:

scala> X.apply[Int].getClass.hashCode
res7: Int = 45806309
scala> X.apply[String].getClass.hashCode
res8: Int = 45806309

是有这种行为的原因,还是Scala编译器只是缺乏一个单一类的明智优化?

看来,这种行为是类型成员的类和带有类型参数类(class Y[T])类的另一个区别:

scala> class Y[T]
defined class Y
scala> new Y[Int].getClass.hashCode
res9: Int = 1364679843
scala> new Y[String].getClass.hashCode
res10: Int = 1364679843

表单的每个表达式new Something(someArgs) { /* other defs, whether overriding or not */ }的每个表达式都定义了静态不同的类型,即使它们在结构上等效。

另一方面,多次评估任何单个此类表达式会实例化相同的匿名类。

它与抽象类型成员的存在无关。

最新更新