【问题标题】:Why can't I access automatically generated default method in Kotlin?为什么我无法访问 Kotlin 中自动生成的默认方法?
【发布时间】:2018-02-24 22:37:47
【问题描述】:

我正在研究 kotlin,现在对下一件事感到好奇:

我有下一节课:

class Test5 {
    fun x(x: Int = 5) { }
}

我在字节码中看到生成了下一个方法来桥接默认值:

  public static synthetic bridge x$default(LTest5;IILjava/lang/Object;)V
    ILOAD 2
    ICONST_1
    IAND
    IFEQ L0
   L1
    LINENUMBER 4 L1
    ICONST_5
    ISTORE 1
   L0
    ALOAD 0
    ILOAD 1
    INVOKEVIRTUAL Test5.x (I)V
    RETURN
    MAXSTACK = 2
    MAXLOCALS = 4

但是在 Intelij 中我不能直接调用这个方法。为什么不可能?它只是IDE技巧吗?

【问题讨论】:

    标签: java kotlin


    【解决方案1】:

    您需要使用 @JvmOverloads 对其进行注释,以便从 Java 中调用它。

    来自documentation for @JvmOverloads:

    通常,如果您使用默认参数值编写 Kotlin 函数,它在 Java 中将仅作为完整签名可见,并且所有参数都存在。如果您希望向 Java 调用者公开多个重载,可以使用 @JvmOverloads 注释。

    注解也适用于构造函数、静态方法等。它不能用于抽象方法,包括接口中定义的方法。

    例子:

    class Test5 {
        @JvmOverloads
        fun x(x: Int = 5) { }
    }
    

    【讨论】:

    • 谢谢托德,我知道了。我只是好奇这种行为是如何实现的——方法是字节码,但我不能称之为......
    • @the_kaba 那是因为 synthetic 修饰符,这意味着编译器应该忽略该方法,它也用于扩展例如 ArrayList (不是你应该 i> 这样做),它会生成一个合成的add(Object obj) 方法,该方法调用add((String)obj)
    • Ferrybig,感谢您的回答。不是更干净。因此该方法对 IDE 不可见,因为它在编译后出现..
    • 该方法对 IDE 不可见,因为它被标记为合成。它在什么时候出现是无关紧要的。
    猜你喜欢
    • 2012-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-11
    • 2014-04-06
    • 1970-01-01
    相关资源
    最近更新 更多