首页 > 解决方案 > 在最简单的情况下,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 返回一个装箱的值。

标签: javaandroidkotlinoptimizationjvm

解决方案


推荐阅读