Kotlin中@JvmOverloads注解的作用

在Kotlin中@JvmOverloads注解的作用:指示Kotlin编译器为此函数生成替换默认参数值的重载。

如果一个方法有N个参数,其中M个具有默认值,则会生成M个重载。

第一个重载采用N-1个参数(最后一个采用默认值),第二个采用N-2个参数,依此类推。

因为在 Kotlin 中可以调用具有默认参数值的方法或者构造函数,但是在 Java 代码调用相应 Kotlin 代码却不行,及Java 代码不能调用 Kotlin 中定义的具有默认参数的重载函数或构造函数。@JvmOverloads 就是用来解决这一问题的。

 

例子:

普通函数如下:

  • Kotlin方法参数无默认值:
@JvmOverloads
fun testOverload(a: String, b: Int, c: Long) {

}

转换成对应的Java代码是:

@JvmOverloads
public static final void testOverload(@NotNull String a, int b, long c) {
   Intrinsics.checkParameterIsNotNull(a, "a");
}

 

  • Kotlin方法参数有一个默认值:
@JvmOverloads
fun testOverload(a: String, b: Int, c: Long = 0L) {

}

转换成对应的Java代码是:

@JvmOverloads
public static final void testOverload(@NotNull String a, int b, long c) {
   Intrinsics.checkParameterIsNotNull(a, "a");
}

// $FF: synthetic method
public static void testOverload$default(String var0, int var1, long var2, int var4, Object var5) {
   if ((var4 & 4) != 0) {
      var2 = 0L;
   }

   testOverload(var0, var1, var2);
}

@JvmOverloads
public static final void testOverload(@NotNull String a, int b) {
   testOverload$default(a, b, 0L, 4, (Object)null);
}
  • Kotlin方法具有两个默认值:
@JvmOverloads
fun testOverload(a: String, b: Int = 1, c: Long = 0L) {

}

转换成Java代码如下:

@JvmOverloads
public static final void testOverload(@NotNull String a, int b, long c) {
   Intrinsics.checkParameterIsNotNull(a, "a");
}

// $FF: synthetic method
public static void testOverload$default(String var0, int var1, long var2, int var4, Object var5) {
   if ((var4 & 2) != 0) {
      var1 = 1;
   }

   if ((var4 & 4) != 0) {
      var2 = 0L;
   }

   testOverload(var0, var1, var2);
}

@JvmOverloads
public static final void testOverload(@NotNull String a, int b) {
   testOverload$default(a, b, 0L, 4, (Object)null);
}

@JvmOverloads
public static final void testOverload(@NotNull String a) {
   testOverload$default(a, 0, 0L, 6, (Object)null);
}

 

 

构造函数如下:

  • 无默认参数值的构造函数:
open class MaxHeightRelativeLayout @JvmOverloads constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : RelativeLayout(context, attrs, defStyleAttr) {

}

转换成Java代码如下:

public class MaxHeightRelativeLayout extends RelativeLayout {
   @JvmOverloads
   public MaxHeightRelativeLayout(@NotNull Context context, @NotNull AttributeSet attrs, int defStyleAttr) {
      Intrinsics.checkParameterIsNotNull(context, "context");
      Intrinsics.checkParameterIsNotNull(attrs, "attrs");
      super(context, attrs, defStyleAttr);
   }
}
  • 具有一个默认值的构造函数: 
open class MaxHeightRelativeLayout @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int) : RelativeLayout(context, attrs, defStyleAttr) {

}

转换成 Java代码如下:

public class MaxHeightRelativeLayout extends RelativeLayout {
   @JvmOverloads
   public MaxHeightRelativeLayout(@NotNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
      Intrinsics.checkParameterIsNotNull(context, "context");
      super(context, attrs, defStyleAttr);
   }

   // $FF: synthetic method
   public MaxHeightRelativeLayout(Context var1, AttributeSet var2, int var3, int var4, DefaultConstructorMarker var5) {
      if ((var4 & 2) != 0) {
         var2 = (AttributeSet)null;
      }

      this(var1, var2, var3);
   }

   @JvmOverloads
   public MaxHeightRelativeLayout(@NotNull Context context, int defStyleAttr) {
      this(context, (AttributeSet)null, defStyleAttr, 2, (DefaultConstructorMarker)null);
   }
}

 

  • 具有两个默认参数值的构造函数:
open class MaxHeightRelativeLayout @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : RelativeLayout(context, attrs, defStyleAttr) {

}

转Java代码如下:

public class MaxHeightRelativeLayout extends RelativeLayout {
   @JvmOverloads
   public MaxHeightRelativeLayout(@NotNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
      Intrinsics.checkParameterIsNotNull(context, "context");
      super(context, attrs, defStyleAttr);
   }

   // $FF: synthetic method
   public MaxHeightRelativeLayout(Context var1, AttributeSet var2, int var3, int var4, DefaultConstructorMarker var5) {
      if ((var4 & 2) != 0) {
         var2 = (AttributeSet)null;
      }

      if ((var4 & 4) != 0) {
         var3 = 0;
      }

      this(var1, var2, var3);
   }

   @JvmOverloads
   public MaxHeightRelativeLayout(@NotNull Context context, @Nullable AttributeSet attrs) {
      this(context, attrs, 0, 4, (DefaultConstructorMarker)null);
   }

   @JvmOverloads
   public MaxHeightRelativeLayout(@NotNull Context context) {
      this(context, (AttributeSet)null, 0, 6, (DefaultConstructorMarker)null);
   }
}

 

Kotlin,@Qualifier注解通常用于与依赖注入框架一起使用,以标识特定的依赖项。在使用依赖注入框架时,您可以使用@Qualifier注解来指定要注入的依赖项的特定实现。 以下是一个简单的示例,演示如何使用@Qualifier注解: ```kotlin interface MyDependency class MyFirstDependency : MyDependency { override fun toString(): String { return "MyFirstDependency" } } class MySecondDependency : MyDependency { override fun toString(): String { return "MySecondDependency" } } class MyComponent { @Qualifier @Retention(AnnotationRetention.RUNTIME) annotation class FirstDependency @Qualifier @Retention(AnnotationRetention.RUNTIME) annotation class SecondDependency @Inject @FirstDependency lateinit var firstDependency: MyDependency @Inject @SecondDependency lateinit var secondDependency: MyDependency } fun main(args: Array<String>) { val component = DaggerMyComponent.builder().build() println(component.firstDependency) // prints "MyFirstDependency" println(component.secondDependency) // prints "MySecondDependency" } ``` 在上面的示例,我们定义了一个MyDependency接口,然后实现了两个具体的实现MyFirstDependency和MySecondDependency。接下来,我们定义了一个MyComponent类,其包含了@FirstDependency和@SecondDependency注解来标识要注入的特定依赖项。最后,我们使用Dagger2库生成MyComponent实例,并打印出注入的依赖项。 请注意,@Qualifier注解本身并不提供任何特定的注入功能,而只是用于标识特定的依赖项。实际的注入功能由依赖注入框架提供。在上面的示例,我们使用了Dagger2库来实现依赖注入。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值