在Java中使用具有相同数据类型的Kotlin重载方法参数

jk9hmnmh  于 2023-06-20  发布在  Java
关注(0)|答案(1)|浏览(82)

我有一个kotlin代码/库,最终将在Java中使用,其中一个方法是:

@JvmOverloads
fun sample(
    param1: ByteArray,
    param2: ByteArray = byteArrayOf(),
    param3: ByteArray = customMethod()
): ByteArray { ... }

由于该方法是重载的(@JvmOverloads),如何在java中只使用sample(param1, param3),不包括param2
Java将sample(param1, param3)中的第二个参数检测为param2,而不是param3,因为它们具有相同的数据类型。
我真的必须求助于null s或者一个空的byte[]来跳过这一部分吗?

    • 我试过了:**
  • 返回到null s并在此基础上进行检查,所以现在我有了sample(param1, null, param2);
  • 使用空的byte[]跳过部分,所以现在我有了sample(param1, byte[], param2);

但是,我希望/更喜欢有param2未定义/跳过,而不是被定义。

    • 我研究过的(但没有尝试过)**
  • 数据类作为参数(?)
fun sample(param: DataClass): ByteArray { ... }
  • 但是“不要在API中使用数据类”
  • 此代码:
Foo foo = new Foo() {{
    color = red;
    name = "Fred";
    size = 42;
}};

来源:https://stackoverflow.com/a/1988268/16171990
但我不认为他们是可取的(最后手段也许?)

dfty9e19

dfty9e191#

由于方法是重载的(@JvmOverloads),我如何在java中使用它,只有sample(param 1,param 3),不包括param 2?
@JvmOverloads只生成包含从第一个到最后一个参数的重载。因此,您可以使用param1param2调用,但不能使用param1param3调用。
你可以交换参数的顺序,但只有当你不需要其他地方的param 1和2版本时才有效。或者,你可以手动添加一个重载,只需要1和3,并从java调用它:
fun sample2(param1: ByteArray, param3: ByteArray) = sample(param1, param3 = param3)
这一个应该有一个不同的名称(或者你可能会与param 1和2版本混淆),并且它不需要param3的默认值(因为只需使用原始方法)。

相关问题