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