什么是Scala最便宜的类型?

Adr*_*ian 8 types scala

我需要使用一个类型(任何类型)作为隐式的标记作为类型参数,以区别于另一个隐式.这很奇怪,但这可能是另一个问题.

由于我可以使用任何类型,我在考虑使用最便宜的内存占用初始化时间.在这种情况下,它可能不会对性能造成太大影响,但问题很有趣:哪一个是Scala最便宜的类型?

在Java中,答案很明显java.lang.Object.但是Scala有一些"有趣"的类型:Any,AnyVal类型和底部类型,可能会围绕它们进行优化.该Nothing类型无法实例化,因此从此比较中排除.

Kev*_*ght 13

这取决于你的确切问题,但Scala中最便宜的构造 - 或任何语言 - 必须是一个根本不存在的构造...(至少,不是在运行时)

请允许我介绍Phantom Types,允许编译器静态地执行正确的操作,但在它们命中JVM之前会被删除.

同样,您可以轻松区分两个不同类型的对象,而无需任何标记字段.这是case objects的一个很好的候选者,并且与模式匹配非常好地协同工作.


Dan*_*ral 3

如果您选择AnyAnyVal,那么您传递的任何原语都将被装箱,因此这可能会被排除。

AnyRef确实是一个不错的选择。

如果没有进行任何类型参数化,那么“原语”也是不错的选择——例如Boolean或。Int

还有Null,这是一个非常有趣的选择,因为它根本不分配任何东西,而且它是一个文字,所以它一定会很快。在不知道你到底用它做什么的情况下,我无法判断这是否是有效的选择。

另一个有趣的选项是java.lang.Integer(使用 static 方法valueOf),因为它保证小值的引用相等(您必须检查文档以了解精确的范围),这意味着不涉及分配。