网络将类内联化;内联类;将类别内联化 网络释义
作为一个大版本,1.5带来了不少新特性,其中最主要的要数 inline class 了。早在 kotlin 1.3 就已经有了 inline class 的alpha版本。到 1.4.30 进入 beta,如今在 1.5.0 中 终于迎来了 Stable 版本。早期的实验版本的 inline 关键字 在 1.5 中被废弃,转而变为 value关键字//before 1.5inlineclas...
inline class DoggoId(val id: Long) : Id 让我们逐步分析反编译后的 Java 代码,并分析它们对使用内联类的影响。您可以在下方注释找到完整的反编译代码。 原理—— 构造函数 /* Copyright 2019 Google LLC. SPDX-License-Identifier: Apache-2.0 */ public final class DoggoId implements Id { // $FF: sy...
总结一下,当使用inline class的时候,如果当前代码根据上下文可以推断出变量一定是inline class类型,编译器就可以优化代码,不生成新的类实例,从而达到节省内存空间的目的。但是如果通过上下文推断不出来变量是否是inline class,编译器就会调用装箱方法,创建新的inline class类实例,划分内存空间给inline class实例,也就达不到...
但是,inline class 的成员不能有自己的幕后属性,只能作为代理使用。inline class 的创建的对象在字节码中会被消除,所以这个实例无法拥有自己的状态以及行为,对 inline class 实例的方法调用,在实际运行时会变为一个静态方法调用。 Inline class 的继承 interface Printable { fun prettyPrint(): String @JvmInline va...
Inline Class在某种程度上与typealias关键字很相似,但与 typealias 不同的是Inline Class是真实存在的类型,而 typealias 关键字只是为某个类引入了其他别名。 Inline Class 与其包装的类型是不同的两个类型,但 typealias 声明的类本质上与其原始名称的类型是同一个类型,在编译之后会被替换成其别名的原始类型。
classB:A{override funfoo():ICAny{returnICAny(1)}} 接着实现这个interface,在重载的foo的返回值上面我们返回刚刚定义的inline class类。因为ICAny肯定是Any(在jvm里面是Object)的子类,所以这个方法是能够通过编译的。 接下来神奇的事情发生了。 在调用下面的代码的时候 ...
inline class Duration(val value: Long) 1. 从1.5版本开始,上面这种写法被废弃了,转而启用稳定版的写法: @JvmInline value class Duration(val value: Long) 1. 2. 即,由关键字 inline 转为注解 @JvmInline + 关键字 value,但是二者在构造函数里面都是有且仅有一个成员变量。
1. 在absorbing class(合并端的那个class)身上声明source class的public协议,并将其中所有函数委托(delegate)至source class。 如果[以一个独立接口表示source class函数]更合适的话,就应该在inlining之前先使用Extract Interface(341)。 2. 修改所有source class引用点,改而引用absorbing class。
而 inline class 在最终生成的字节码中被替换成其 “包装”的 value, 进而提高运行时的性能。 // For JVM backends @JvmInline value class Password(private val s: String) 复制代码 1. 2. 3. 4. 如上,inline class 构造参数中有且只能有一个成员变量,即最终被inline到字节码中的value。