当前位置:主页 > android教程 > Kotlin @JvmOverloads注解

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

发布:2023-03-07 16:00:01 59


给寻找编程代码教程的朋友们精选了相关的编程文章,网友司雪环根据主题投稿了本篇教程内容,涉及到Kotlin、@JvmOverloads注解、Kotlin、@JvmOverloads、Kotlin @JvmOverloads注解相关内容,已被305网友关注,内容中涉及的知识点可以在下方直接下载获取。

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


参考资料

相关文章

  • Kotlin协程的启动方式介绍

    发布:2023-03-06

    这篇文章我们来讲协程的启动,毕竟协程是一个很强大的设计模式,深入了解需要花很多的时间,我们先从简单开始,其实学会了简单的使用,基本已经可以满足我们平时的开发需要了,话不多说,开始


  • Kotlin Flow操作符及基本使用详解

    发布:2023-03-03

    这篇文章主要为大家介绍了Kotlin Flow操作符及基本使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪


  • Kotlin数据容器深入讲解

    发布:2023-03-08

    Kotlin的数据容器分为数组和集合。其中集合分为集合Set、队列List、映射Map等三种集合,每种又包括只读和可变两种类型,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧


  • Kotlin 协程异步热数据流的设计与使用讲解

    发布:2023-03-11

    这篇文章主要为大家介绍了Kotlin 协程协程异步热数据流的设计与使用讲解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪


  • Kotlin协程的基础与使用示例详解

    发布:2023-03-11

    这篇文章主要为大家介绍了Kotlin协程的基础与使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪


  • Kotlin基础通关之字符串与数字类型

    发布:2023-03-03

    这篇文章主要介绍了Kotlin基础知识中的字符串与数字类型,编程中的入门知识,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧


  • 实例讲解Kotlin开发环境

    发布:2020-02-11

    这篇文章主要介绍了 Kotlin 开发环境详解及简单实例的相关资料,需要的朋友可以参考下


  • 解析Kotlin接口与Java8新特性接口

    发布:2020-03-13

    这篇文章主要介绍了Kotlin 接口与 Java8 新特性接口,Kotlin的接口是可以包含属性声明。Kotlin默认的声明是fianl 和public的。Kotlin里嵌套的类默认并不是内部内,不包含对器外部类的隐式调用。下面我


网友讨论