【问题标题】:kotlin: how can I call function from object expressionkotlin:如何从对象表达式中调用函数
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-20
    • 1970-01-01
    • 1970-01-01
    • 2014-01-28
    • 1970-01-01
    相关资源
    最近更新 更多