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注解内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Kotlin基础学习之Deprecated与Suppress注解使用

    前言 在 Java 中通常对一些方法进行一些注解操作,但是很多注解在 Java 代码上没有问题,如果切换到 Kotlin 上时,如果继续使用这些注解就会存在一些问题,本篇主要对比一些常用 Java 注解和 Kotlin 注解使用转换. Deprecated 在 Java 方法中,如果需要废弃一个方法,只需要在方法钱加上 @Deprecated 即可,例如这样: @Deprecated public void test(){ } 但是如果在 Kotlin 代码中直接使用这个注释,就存在问题了: D

  • Kotlin 基础教程之注解与java中的注解比较

    Kotlin 的注解完全兼容 Java 的注解. 声明注解 @Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.VALUE_PARAMETER, AnnotationTarget.EXPRESSION) @Retention(AnnotationRetention.SOURCE) @MustBeDocumented annotation class Fancy 可以通过向注解类添加元注解(meta

  • 教你一文搞懂Kotlin中的Jvm注解

    JvmOverloads 创建一个kotlin的类 class Student(val name: String, val sex: Int = 1, val age: Int = 18) 可以看出来 这个构造函数的参数是有默认值的,kotlin的特性对吧,我们在使用的时候可以方便的使用,比如: val student = Student("wuyue") val student2 = Student("wuyue", age = 18) 但是这个特性如果你用jav

  • Kotlin 的注解类详解及实例

    Kotlin 的注解类详解及实例 注解声明 注解是将元数据附加到代码的方法.要声明注解,请将 annotation 修饰符放在类的前面: annotation class Fancy 注解的附加属性可以通过用元注解标注注解类来指定: @Target 指定可以用 该注解标注的元素的可能的类型(类.函数.属性.表达式等): @Retention 指定该注解是否 存储在编译后的 class 文件中,以及它在运行时能否通过反射可见 (默认都是 true): @Repeatable 允许 在单个元素上多次

  • Android kotlin使用注解实现防按钮连点功能的示例

    SingleClick: @Retention(AnnotationRetention.RUNTIME) @Target(AnnotationTarget.FUNCTION) annotation class SingleClick( // 点击间隔时间,毫秒 val value: Long = 500 ) SingleClickAspect: import android.os.SystemClock import org.aspectj.lang.ProceedingJoinPoint im

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

    在Kotlin中@JvmOverloads注解的作用:指示Kotlin编译器为此函数生成替换默认参数值的重载. 如果一个方法有N个参数,其中M个具有默认值,则会生成M个重载. 第一个重载采用N-1个参数(最后一个采用默认值),第二个采用N-2个参数,依此类推. 因为在 Kotlin 中可以调用具有默认参数值的方法或者构造函数,但是在 Java 代码调用相应 Kotlin 代码却不行,及Java 代码不能调用Kotlin 中定义的具有默认参数的重载函数或构造函数.@JvmOverloads 就是用

  • SpringMVC中RequestMapping注解(作用、出现的位置、属性)

    RequestMapping注解 作用出现位置属性 作用 用于建立请求 URL 和处理请求方法之间的对应关系. 出现位置 1.作用在类上:请求 URL 的第一级访问目录.此处不写的话,就相当于应用的根目录.写的话需要以/开头. 2.作用在方法上:请求 URL 的第二级访问目录. 控制器中部分代码示例: @Controller @RequestMapping(path = "/user") //第一级的访问目录 public class HelloController { @Reques

  • Android中实现视差滚动示例介绍

    什么是视差滚动? 视差滚动原本是一个天文学术语,当我们观察星空的时候,离我们比较远的星星移动速度比较慢,离我们比较近的星星移动速度比较快,当我们坐在车上向车窗外看的时候也会有这种体验,远处的群山似乎没有移动,但近处的行道树却在飞速掠过. 在工程设计中,视差滚动是指通过为背景图像设定比前景图像更慢的移动速度模拟现实世界中人类的视觉体验,从而在 2D 场景中产生深度的错觉,增加沉浸感. 以下是几个设计实例: 如何在 Android 中实现视差滚动? 首先创建一个新项目 新建 Android proj

  • c++中ref的作用示例解析

    目录 正文 示例1: 输出: 输出: 总结 正文 C++11 中引入 std::ref 用于取某个变量的引用,这个引入是为了解决一些传参问题. 我们知道 C++ 中本来就有引用的存在,为何 C++11 中还要引入一个 std::ref 了?主要是考虑函数式编程(如 std::bind)在使用时,是对参数直接拷贝,而不是引用.下面通过例子说明 示例1: #include <functional> #include <iostream> void f(int& n1, int&

  • Vue中key的作用示例代码详解

    Vue中key的作用 key的特殊attribute主要用在Vue的虚拟DOM算法,在新旧Nodes对比时辨识VNodes.如果不使用key,Vue会使用一种最大限度减少动态元素并且尽可能的尝试就地修改.复用相同类型元素的算法,而使用key时,它会基于key的变化重新排列元素顺序,并且会移除key不存在的元素.此外有相同父元素的子元素必须有独特的key,重复的key会造成渲染错误. 描述 首先是官方文档的描述,当Vue正在更新使用v-for渲染的元素列表时,它默认使用就地更新的策略,如果数据项的

  • Spring中常用注解的详细介绍

    spring中使用注解时配置文件的写法: <?xml version="1.0" encoding="UTF-8"?> <span style="font-size:18px;"><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-in

  • Spring Boot @Conditional注解用法示例介绍

    引用Spring官方文档的说法介绍一下@Conditional注解:Spring5.0.15版本@Conditional注解官方文档 @Conditional表示仅当所有指定条件都匹配时,组件才有资格注册 . 该@Conditional注释可以在以下任一方式使用: 作为任何@Bean方法的方法级注释 作为任何类的直接或间接注释的类型级别注释 @Component,包括@Configuration类 作为元注释,目的是组成自定义构造型注释 改注解主要源码之一,通过match匹配,符合条件才装载到S

  • JS脚本defer的作用示例介绍

    复制代码 代码如下: <script src="../cgi-bin/delscript.js" defer></script> 中的defer作用是文档加载完毕了再执行脚本,这样回避免找不到对象的问题---有点问题 <button id="myButton" onclick="alert('ok')">test</button> <script> myButton.click(); &

  • Flex中Array的IndexOf 的作用示例介绍

    Flex中 Array 的IndexOf 的作用 1.说明 indexOf用于在索引中从小到大查找,如果查得到就返回索引值,查不到就返回-1: 2.实例 (1)设计源码 复制代码 代码如下: <?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://n

  • JavaScript中双叹号!!作用示例介绍

    !!一般用来将后面的表达式强制转换为布尔类型的数据(boolean),也就是只能是true或者false; 经常看到这样的例子: 复制代码 代码如下: var a: var b=!!a; a默认是undefined.!a是true,!!a则是false,所以b的值是false,而不再是undefined,也非其它值,主要是为后续判断提供便利. !!一般用来将后面的表达式强制转换为布尔类型的数据(boolean),也就是只能是true或者false; 因为javascript是弱类型的语言(变量没

随机推荐