科特林:我怎样才能从对象表达
问题描述:
调用函数我有这样的代码:科特林:我怎样才能从对象表达
// foo.kt
fun bar() {
val foo = object {
fun zzz() {
println()
}
}
foo.zzz()
}
而且我用kotlinc foo.kt
编译科特林代码。我得到了'FooKt.class'和'FooKt $ bar $ foo $ 1.class'。 然后我反编译“FooKt.class”文件发现Java代码,它是这样的(由JD-GUI):
import java.io.PrintStream;
import kotlin.Metadata;
@Metadata(mv={1, 1, 6}, bv={1, 0, 1}, k=2, d1={"\000\006\n\000\n\002\020\002\032\006\020\000\032\0020\001"}, d2={"bar", ""})
public final class MainKt
{
public static final void bar()
{
Object foo = new Object()
{
public final void zzz()
{
System.out.println();
}
};
foo.zzz(); // You can NOT do this in java world. But kotlin can do. Why?
}
}
我很好奇上面的Java代码。如果将代码粘贴到任何IDE并编译(javac),则会出现错误:zzz unresolved
。 上面的错误说,即使你扩展它,你也不能从new Object()
调用任何自定义函数。 现在的问题是:Kotlin生成这样的错误代码,但一切似乎都没问题,为什么?
答
这是因为Kotlin创建了一个额外的类,从对象FooKt$bar$foo$1.class
延伸。您始终可以使用匿名对象,而不是将其暴露在范围之外。
https://kotlinlang.org/docs/reference/object-declarations.html
请显示反编译的FooKt $ bar $ foo $ 1.class – Rahul