【发布时间】:2017-08-07 08:23:02
【问题描述】:
我有这样的代码:
// 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 生成了这样的错误代码,但似乎一切正常,为什么?
【问题讨论】:
-
请显示反编译的FooKt$bar$foo$1.class
标签: kotlin