带主体的 Kotlin 抽象方法
Kotlin abstract method with body
如前所述here:如果接口中的函数没有主体,则默认情况下它是抽象的。但是没有关于接口与主体的功能。
示例:
interface MyInterface {
fun foo() { print("Something") }
fun bar()
}
fun main(args: Array<String>) {
println(MyInterface::foo.javaMethod)
println(MyInterface::bar.javaMethod)
}
输出将是:
public abstract void MyInterface.foo()
public abstract void MyInterface.bar()
怎么可能,定义主体的方法是抽象的?
这与 Kotlin 接口中默认方法的实现方式有关。界面中的 foo
和 bar
方法实际上都是抽象的。
但是,在界面内部有一个内部 class 看起来像这样(简化):
public interface MyInterface {
void foo();
void bar();
public static final class DefaultImpls {
public static void foo() {
System.out.print("Something");
}
}
}
这个 class 是一个包含您在接口内部赋予主体的任何函数的默认实现的函数。
然后,如果您创建一个实现此接口的 class,并且您不重写 foo
方法:
class MyClass: MyInterface {
override fun bar() {
println("MyClass")
}
}
然后自动生成一个,调用里面的实现DefaultImpls
:
public final class MyClass implements MyInterface {
public void bar() {
System.out.println("MyClass");
}
public void foo() {
MyInterface.DefaultImpls.foo();
}
}
您可以使用 Kotlin 插件附带的字节码查看器(Tools -> Kotlin -> Show Kotlin Bytecode
,然后是 Decompile
选项)找到所有这些详细信息。
如前所述here:如果接口中的函数没有主体,则默认情况下它是抽象的。但是没有关于接口与主体的功能。
示例:
interface MyInterface {
fun foo() { print("Something") }
fun bar()
}
fun main(args: Array<String>) {
println(MyInterface::foo.javaMethod)
println(MyInterface::bar.javaMethod)
}
输出将是:
public abstract void MyInterface.foo()
public abstract void MyInterface.bar()
怎么可能,定义主体的方法是抽象的?
这与 Kotlin 接口中默认方法的实现方式有关。界面中的 foo
和 bar
方法实际上都是抽象的。
但是,在界面内部有一个内部 class 看起来像这样(简化):
public interface MyInterface {
void foo();
void bar();
public static final class DefaultImpls {
public static void foo() {
System.out.print("Something");
}
}
}
这个 class 是一个包含您在接口内部赋予主体的任何函数的默认实现的函数。
然后,如果您创建一个实现此接口的 class,并且您不重写 foo
方法:
class MyClass: MyInterface {
override fun bar() {
println("MyClass")
}
}
然后自动生成一个,调用里面的实现DefaultImpls
:
public final class MyClass implements MyInterface {
public void bar() {
System.out.println("MyClass");
}
public void foo() {
MyInterface.DefaultImpls.foo();
}
}
您可以使用 Kotlin 插件附带的字节码查看器(Tools -> Kotlin -> Show Kotlin Bytecode
,然后是 Decompile
选项)找到所有这些详细信息。