kotlin:我怎样才能从对象表达式调用函数

我有这样的代码:

// foo.kt fun bar() { val foo = object { fun zzz() { println() } } foo.zzz() } 

我用kotlinc foo.kt来编译kotlin代码。 我得到了'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