我有这样的代码:
// 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生成了这样的错误代码,但一切似乎都没问题,为什么?
答案 0 :(得分:0)
这是因为Kotlin创建了一个从对象FooKt$bar$foo$1.class
扩展的额外类。您可以使用匿名对象,而不是将其暴露在范围之外。
https://kotlinlang.org/docs/reference/object-declarations.html