Kotlin-扩展函数、属性原理

2022-03-30  本文已影响0人  杨0612
例子

以下定义了String的扩展函数isContainA,用于判断字符串是否包含字母a;

//扩展函数
fun String.isContainA(): Boolean {
    return this.contains("a")
}

//扩展属性
val String.isContainB: Boolean
    get() {
        return this.contains("b")
    }

反编译
//扩展函数反编译
public static final boolean isContainA(@NotNull String value) {
      Intrinsics.checkNotNullParameter(value, "value");
      return StringsKt.contains$default((CharSequence)value, (CharSequence)"a", false, 2, (Object)null);
   }
   
//扩展属性反编译

public static final boolean isContainB(@NotNull String $this$isContainB) {
   Intrinsics.checkNotNullParameter($this$isContainB, "$this$isContainB");//1
   return StringsKt.contains$default((CharSequence)$this$isContainB, (CharSequence)"b", false, 2, (Object)null);//2
}

发现扩展函数、属性并没有对String类进行修改,只是定义了一个静态函数,函数名就是我们扩展的函数或属性,参数类型为是String。

String.isContainA()和String?.isContainA()有区别吗?
fun String.isContainA(): Boolean {
    return this.contains("a")
}

fun String?.isContainA(): Boolean {
    return this?.contains("a") ?: false
}
反编译
   public static final boolean isContainA(@NotNull String value) {
      Intrinsics.checkNotNullParameter(value, "value");
      return StringsKt.contains$default((CharSequence)value, (CharSequence)"a", false, 2, (Object)null);
   }

   public static final boolean isContainA(@Nullable String value) {
      return value != null ? StringsKt.contains$default((CharSequence)value, (CharSequence)"a", false, 2, (Object)null) : false;
   }
Java访问扩展函数\属性;
public void test(){
    AKt.isContainB("");//访问扩展属性,AKt是扩展函数所在的文件名
    AKt.isContainA("");//访问扩展函数,AKt是扩展函数所在的文件名
}
使用场景
注意事项

以上分析有不对的地方,请指出,互相学习,谢谢哦!

上一篇 下一篇

猜你喜欢

热点阅读