每当班级
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
答案 0 :(得分:7)
new Something(someArgs) { /* other defs, whether overriding or not */ }
形式的每个表达式都定义了一个静态不同的类型,即使它们在结构上是等价的。
另一方面,多次评估任何单个此类表达式会实例化同一个匿名类。
它与抽象类型成员的存在无关。