Kotlin中@JvmOverloads注解作用示例介绍

 更新时间:2022年09月07日 16:50:22   作者:且听真言  
在Kotlin中@JvmOverloads注解的作用就是:在有默认参数值的方法中使用@JvmOverloads注解,则Kotlin就会暴露多个重载方法。可能还是云里雾里,下面来详细了解

在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中@JvmOverloads注解作用示例介绍的文章就介绍到这了,更多相关Kotlin @JvmOverloads注解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Android Service完整实现流程分析

    Android Service完整实现流程分析

    Android的服务是开发Android应用程序的重要组成部分。不同于活动Activity,服务是在后台运行,服务没有接口,生命周期也与活动Activity非常不同。通过使用服务我们可以实现一些后台操作,比如想从远程服务器加载一个网页等,下面来看看详细内容,需要的朋友可以参考下
    2023-01-01
  • MPAndroidChart绘制自定义运动数据图表示例详解

    MPAndroidChart绘制自定义运动数据图表示例详解

    这篇文章主要为大家介绍了MPAndroidChart绘制自定义运动数据图表示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • Android  ListView 条目多样式展示实例详解

    Android ListView 条目多样式展示实例详解

    这篇文章主要介绍了Android ListView 条目多样式展示的相关资料,需要的朋友可以参考下
    2017-04-04
  • Android事件分发的事件由来原理分析

    Android事件分发的事件由来原理分析

    这篇文章主要为大家介绍了Android事件分发的事件由来原理分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • Android入门之BroadCast模拟实现异地登录事件发生后的主动退出

    Android入门之BroadCast模拟实现异地登录事件发生后的主动退出

    随着对BroadCast的越来越深入,我们今天要实现一个稍微复杂一点的BroadCast。即只允许一个设备登录一个帐号时,APP会弹一个对话框如:您的账号在别处登录,请重新登陆!感兴趣的可以了解一下
    2022-12-12
  • Android中断线程的处理方法

    Android中断线程的处理方法

    这篇文章主要介绍了Android中断线程的处理方法,涉及到线程的中断、处理与返回等操作,具有一定的参考借鉴价值,需要的朋友可以参考下
    2014-11-11
  • 解决Android SearchView不显示搜索icon的问题

    解决Android SearchView不显示搜索icon的问题

    这篇文章主要介绍了解决Android SearchView不显示搜索icon问题,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-05-05
  • flutter实现底部导航栏

    flutter实现底部导航栏

    这篇文章主要为大家详细介绍了flutter实现底部导航栏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • 浅谈Android中AsyncTask的工作原理

    浅谈Android中AsyncTask的工作原理

    AsyncTask是Android本身提供的一种轻量级的异步任务类。它可以在线程池中执行后台任务,然后把执行的进度和最终的结果传递给主线程更新UI。本文将介绍Android中AsyncTask的工作原理。
    2021-06-06
  • Android Shape属性创建环形进度条

    Android Shape属性创建环形进度条

    这篇文章主要介绍了Android Shape属性创建环形进度条的实例代码,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-11-11

最新评论