kotlin:如何从对象表达式

时间:2017-08-07 08:23:02

标签: 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生成了这样的错误代码,但一切似乎都没问题,为什么?

1 个答案:

答案 0 :(得分:0)

这是因为Kotlin创建了一个从对象FooKt$bar$foo$1.class扩展的额外类。您可以使用匿名对象,而不是将其暴露在范围之外。

https://kotlinlang.org/docs/reference/object-declarations.html