java - 在最简单的情况下,VM 是否会跳过自动装箱-拆箱?
问题描述
尝试了一个简单的泛型接口,我发现 Kotlin 似乎总是使用 Java 原语来支持不可为空的变量,并且只将它装在 getter 中。(使用 IDEA 的反编译功能)。如果您创建的属性不是基于满足泛型,则没有装箱。所以这段代码:
interface Provider<T: Any> {
val value: T
}
class WrappedInt(override val value: Int): Provider<Int>{
val primitiveValue = value
}
编译成这个 Java 代码(基本上):
public final class WrappedInt implements Provider {
private final int value;
private final int primitiveValue;
public WrappedInt(int value) {
this.value = value;
this.primitiveValue = this.getValue();
}
@NotNull
public Integer getValue() {
return this.value;
}
public final int getPrimitiveValue() {
return this.primitiveValue;
}
}
我想知道的是,提供属性的原始副本是否有任何价值,所以当通用接口无关紧要时,会有一个优化的 getter 可用。或者虚拟机是否足够聪明,可以跳过直接进入原始变量或方程的变量?例如:
val variable = WrappedInt(5)
val result = variable.value * 5 // Did the backing field get boxed and immediately unboxed here?
我最感兴趣的是 Android 的 ART,还有 JVM。
请注意,如果提供原始属性确实很有帮助,那么最好在类定义中交换两个属性并为接口属性使用定义的 getter,这样只有一个支持字段。我只是以这种方式离开它来说明支持字段如何是一个原语,而不管 getter 返回一个装箱的值。
解决方案
推荐阅读
- javascript - Flask API 将 Python 列表作为字符串传递
- python - 如果同一行中另一列中的值匹配,如何比较列的两个值
- python - 有没有办法在我的搜索和替换代码中构建异常?
- javascript - 单击按钮后如何将输入数据的 TextField 传递到表单中?
- python-3.x - 为什么我的 import 语句在 PyCharme 中工作时会在 VS 代码中出错?
- javascript - 使用 javascript 和 chart.js 在单个图表上显示两个图表时出现问题
- python - 如何迭代数据框中的行并在每次迭代时访问特定列
- ios - Spotify iOS SDK 1.0.2 - 在没有互联网连接的情况下离线播放专辑
- r - R组合列表项
- c - 在分配算术表达式的结果时,何时在 C 中进行类型强制?