生成默认参数值函数的重载

我们在Kotlin中写一个有默认参数值的 Kotlin 方法,它会对每一个有默认值的参数都生成一个重载函数。这样的Kotlin函数,在 Java 中调用的话,只会有一个所有参数都存在的完整参数签名方法可见。如果我们希望Java像Kotlin中一样可以调用多个重载,可以使用@JvmOverloads注解。

下面我们来通过一个实例对比两者的区别:

这是一段Kotlin代码:

  1. class OverridesFunWithDefaultParams {
  2. fun f1(a: Int = 0, b: String = "B") {
  3. }
  4. @JvmOverloads fun f2(a: Int = 0, b: String = "B") {
  5. }
  6. }

函数f1 和 f2 都带有默认参数。测试代码如下:

  1. @Test
  2. public void testOverridesFunWithDefaultParams() {
  3. OverridesFunWithDefaultParams ofdp = new OverridesFunWithDefaultParams();
  4. ofdp.f1(1, "a");
  5. ofdp.f2();
  6. ofdp.f2(2);
  7. ofdp.f2(2, "b");
  8. }

这就是@JvmOverloads注解的作用,编译器会处理这个注解所标注的函数,并为之生成额外的重载函数给Java调用。