gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 18:08:07 25 4
gpt4 key购买 nike

每当上课

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 */ }定义一个静态不同的类型,即使它们在结构上是等效的。

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

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

关于Scala:为什么修复类型成员会创建 Java 子类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21609947/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com