扩展方法在Kotlin中是如何工作的?

扩展方法在Kotlin中是如何工作的?,kotlin,extension-function,Kotlin,Extension Function,在Java中,您不能扩展最终类,但在Kotlin中,您可以为此类最终类编写扩展方法。他们是如何在内部运作的?我找不到任何解释Kotlin扩展方法内部工作原理的文章 在Java中不能扩展最后一个类,但在Kotlin中可以编写 对此类最终类的扩展方法 我认为您假设扩展方法使用的是继承,而不是继承。这是一种隐藏在kotlin语法糖中的静态方法。例如,请看下面的简单扩展方法: String.removeSpace(): String { return this.replace(" &q

在Java中,您不能扩展最终类,但在Kotlin中,您可以为此类最终类编写扩展方法。他们是如何在内部运作的?我找不到任何解释Kotlin扩展方法内部工作原理的文章

在Java中不能扩展最后一个类,但在Kotlin中可以编写 对此类最终类的扩展方法

我认为您假设扩展方法使用的是继承,而不是继承。这是一种隐藏在kotlin语法糖中的静态方法。例如,请看下面的简单扩展方法:

String.removeSpace(): String {
    return this.replace(" ", "")
}
您可以认为它相当于以下java代码

static String removeSpace(String input) {
    return input.replace(" ", "")
}
kotlin在这里所做的是,它在顶部提供了包装器,以便通过使用
this
可以获得调用方的实例。通过将其与Kotlin将函数定义为第一类公民的能力相结合,您可以编写如下优雅的内容:

fun String.removeSpace() = this.replace(" ", "")
在Java中不能扩展最后一个类,但在Kotlin中可以编写 对此类最终类的扩展方法

我认为您假设扩展方法使用的是继承,而不是继承。这是一种隐藏在kotlin语法糖中的静态方法。例如,请看下面的简单扩展方法:

String.removeSpace(): String {
    return this.replace(" ", "")
}
您可以认为它相当于以下java代码

static String removeSpace(String input) {
    return input.replace(" ", "")
}
kotlin在这里所做的是,它在顶部提供了包装器,以便通过使用
this
可以获得调用方的实例。通过将其与Kotlin将函数定义为第一类公民的能力相结合,您可以编写如下优雅的内容:

fun String.removeSpace() = this.replace(" ", "")

如果您想知道Kotlin代码是如何转换为Java代码的,那么有一种方法可以查看它。IntelliJ将Kotlin字节码反编译为Java代码。您可以找到它
Tools->Kotlin->Show Kotlin Bytecode
,然后点击
Decompile
。然后它将显示Java代码

这里有一个例子

科特林

val Int.asByteArray get()=
拜特拉约夫(
(此shr 24)。toByte(),
(此shr 16)。toByte(),
(此shr 8.toByte(),
这是。toByte()
val Int.asHex get()=this.asByteArray.ashexper
@实验指定类型
val ByteArray.asInt get()=
((此[0].toUInt()和0xFFu)shl 24)或
((此[1].toUInt()和0xFFu)shl 16)或
((此[2].toUInt()和0xFFu)shl 8)或
(此[3].toUInt()和0xFFu)
爪哇

公共最终类IntExtensionKt{
@NotNull
公共静态最终字节[]getAsByteArray(int$this$asByteArray){
返回新字节[]{(字节)($this$asByteArray>>24),(字节)($this$asByteArray>>16),(字节)($this$asByteArray>>8),(字节)$this$asByteArray};
}
@NotNull
公共静态最终字符串getAsHex(int$this$asHex){
返回hextensionkt.getashexper(getAsByteArray($asHex));
}
/**@弃用*/
//$FF:合成法
@实验指定类型
公共静态void asInt$注释(字节[]var0){
}
公共静态final int getAsInt(@NotNull byte[]$this$asInt){
Intrinsics.checkParameterisNotFull($this$asInt,“$this$asInt”);
字节var1=$this$asInt[0];
布尔值var2=false;
int var5=UInt.constructor impl(var1);
短var6=255;
布尔var3=假;
var5=UInt.constructor impl(var5和var6);
字节var7=24;
var3=假;

var5=UInt.constructor impl(var5如果您想知道Kotlin代码是如何转换成Java代码的,有一种方法可以查看它。IntelliJ提供了将Kotlin字节码反编译成Java代码的方法。您可以找到它
工具->Kotlin->显示Kotlin字节码
,然后点击
反编译
。然后它将显示Java代码

这里有一个例子

科特林

val Int.asByteArray get()=
拜特拉约夫(
(此shr 24)。toByte(),
(此shr 16)。toByte(),
(此shr 8.toByte(),
这是。toByte()
val Int.asHex get()=this.asByteArray.ashexper
@实验指定类型
val ByteArray.asInt get()=
((此[0].toUInt()和0xFFu)shl 24)或
((此[1].toUInt()和0xFFu)shl 16)或
((此[2].toUInt()和0xFFu)shl 8)或
(此[3].toUInt()和0xFFu)
爪哇

公共最终类IntExtensionKt{
@NotNull
公共静态最终字节[]getAsByteArray(int$this$asByteArray){
返回新字节[]{(字节)($this$asByteArray>>24),(字节)($this$asByteArray>>16),(字节)($this$asByteArray>>8),(字节)$this$asByteArray};
}
@NotNull
公共静态最终字符串getAsHex(int$this$asHex){
返回hextensionkt.getashexper(getAsByteArray($asHex));
}
/**@弃用*/
//$FF:合成法
@实验指定类型
公共静态void asInt$注释(字节[]var0){
}
公共静态final int getAsInt(@NotNull byte[]$this$asInt){
Intrinsics.checkParameterisNotFull($this$asInt,“$this$asInt”);
字节var1=$this$asInt[0];
布尔值var2=false;
int var5=UInt.constructor impl(var1);
短var6=255;
布尔var3=假;
var5=UInt.constructor impl(var5和var6);
字节var7=24;
var3=假;

var5=UInt.constructor-impl(var5)它们只是转换成静态方法,更像是一种语法糖。你是在使用Intellij IDEA还是Android Studio?打开一个具有扩展功能的Kotlin文件,进入工具->Kotlin->显示字节码,然后从弹出的字节码窗口中选择“反编译”。你会看到该代码的Java模拟是什么样子,它会很快恢复很明显,这个技巧是什么!你可以参考这个链接-。它们只是被转换成静态方法,更像是一种语法糖。你使用的是Intellij IDEA还是Android Studio?打开一个具有扩展功能的Kotlin文件,转到工具->Kotlin->显示字节码,然后从弹出的字节码窗口中选择反编译。你会看到这段代码的Java模拟是什么样子的,很快就会明白其中的诀窍是什么!您可以参考t