value class Duration(val value: Long) 1. 2. 即,由关键字 inline 转为注解 @JvmInline + 关键字 value,但是二者在构造函数里面都是有且仅有一个成员变量。 之所以要这么改变,是因为: inline class 有歧义,容易让人联想其跟内联函数的关系:好比抽象类里面有抽象方法,那内联类里面的都是内联方法? Kotlin 在...
总结一下,当使用inline class的时候,如果当前代码根据上下文可以推断出变量一定是inline class类型,编译器就可以优化代码,不生成新的类实例,从而达到节省内存空间的目的。但是如果通过上下文推断不出来变量是否是inline class,编译器就会调用装箱方法,创建新的inline class类实例,划分内存空间给inline class实例,也就达不到...
名字被混淆处理(check_XYhEtbk)主要有两个目的防止重载函数的参数经过 inline 后出现相同签名的情况防止从Java侧调用到参数经过 inline 后的方法Inline class 的成员inline class 具备普通 class 的所有特性,例如拥有成员变量、方法、初始化块等@JvmInlinevalue className(val s: String) {init { require(s.len...
比如,inner class 源码如下: public class OuterClass { public class InnerClass { } } 1. 2. 3. InnerClass 的构造函数是隐式声明(implicitly declared)的,但是它的构造函数需要包含特定的参数,当 Java 编译器在编译 InnerClass 时,就会生成相应的构造函数,大致如下: public class OuterClass { public class ...
inline class 的创建的对象在字节码中会被消除,所以这个实例无法拥有自己的状态以及行为,对 inline class 实例的方法调用,在实际运行时会变为一个静态方法调用。 Inline class 的继承 interface Printable { fun prettyPrint(): String @JvmInline value class Name(val s: String) : Printable { override fun pre...
inline class Name(val s: String) : Printable { override fun prettyPrint(): String = "Let's $s!" } fun main() { val name = Name("Kotlin") println(name.prettyPrint()) // 仍然是调用静态方法 } 2. 内联类不能继承其他类 3. 内联类是 final 类, 不能被其他类继承 ...
【[译]Kotlin中内联类(inline class)完全解析(一)】作者:mikyou 链接:http://t.cn/EyObv3y 导读👉无论你是编写执行在云端的大规模数据流程程序还是低功耗手机运行的应用程序,大多数的开发者都希望他们的代码...
@JvmInlinevalueclassErrorCode(code:Int) Kotlin中在类声明处使用value关键字即可声明一个Inline Class,Inline Class的主构造函数有且仅有一个参数。后续对Inline Class对象的使用,在运行时会将其替换成对其主构造函数中的对应参数的使用。 如果要在Java代码中也能使用Kotline中的生命的Inline Class,需要额外增加@Jvm...
classB:A{override funfoo():ICAny{returnICAny(1)}} 接着实现这个interface,在重载的foo的返回值上面我们返回刚刚定义的inline class类。因为ICAny肯定是Any(在jvm里面是Object)的子类,所以这个方法是能够通过编译的。 接下来神奇的事情发生了。 在调用下面的代码的时候 ...
然而,尽管不创建实例,instanceOf操作仍需处理,这时字节码会被优化,确保正确判断。至于装箱拆箱,inline class遵循与基本类型相似的规则,根据上下文决定是否进行类型转换。最后,我揭示了bug产生的原因:Kotlin的内联类和Java的多态/协变机制冲突,导致在某些情况下无法生成正确的桥接方法。解决办法是为内联...