@JvmName:

扩展方法相关:

先来定义一个扩展方法:

好,接下来再来定义一个扩展函数:

此时报错了。。看一下错误提示:

其中给的提示有点奇怪,第一个是很明显咱们的扩展函数木有接收参数嘛,为啥提示JVM签名是接收一个List参数呢?其实这里就涉及到了扩展函数的语义了,对于扩展函数来说,其实是将被扩展的那个类作为扩展函数的第一个参数传进去的,为啥呢?因为Java中是不支持扩展函数的;第二个咱们声明不是已经定义了不同的泛型嘛,为啥提示这俩方法签名冲突了呢?这里需要注意了在Java中的泛型其实是一个假的泛型,在被编译成了字节码文件中这些泛型的类型都被去掉了,用一个专业术语来描述这个“去掉”就叫“类型擦除”, 然后最终在取值的时候再根据我们定义的泛型类型会向下强制进行类型转换,所以很明显我们定义的这俩方法如果在泛型类型都被擦除之后不就很明显是定义了2个一模一样类型的函数了么,如下:

那。。如果就想将这俩函数定义在一个文件中,其实也是有办法的,需要用到Kotlin注解了,如下:

接下来咱们新建一个Java类来调用一下它:

那如果在Kotlin直接调用呢,其实就简单很多了,如下:

属性相关:

我们知道对于Kotlin中如果定义了一个属性则会自动会生成它的getter和setter,那如果我们手动也定义了一个跟getter或setter方法同名的方法,那是不是就会有冲突的可能,下面来演示一下这种情况:

看提示很明显就是冲突了嘛:

同样的,可以用注解来解冲突,如下:

然后再定义一个Java文件来访问一下:

那如果在Kotlin中去调用呢?

可见Kotlin写的代码在Kotlin调用是要简化很多的。

@JvmOverloads:

我们知道在Kotlin中的方法中是可以支持默认值的,但是在Java中很明显是不支持的,那如何做到两者兼容呢?下面演示一下:

然后新建一个Java来调用一下:

此时就可以用注解来改变一下:

再回到Java中,看此时的构造:

此时也可以传2个参数:

此时就比较理解了,其@JvmOverloads注解发挥了作用,它会给拥有默认参数的构造方法声明重载的版本,回到咱们这个程序来说就会生成如下的重载:

这样就成功的将Kotlin允许有默认参数的行为给适配到Java层了。

类型擦除对Java调用Kotlin的影响的更多相关文章

  1. Java调用Kotlin程序深度解析

    异常: 在之前我们已经学习在Kotlin中的所有异常都是运行期的,而不像Java分为运行期和非运行期,下面用代码来演示一下,先建一个Java的异常: 然后在Kotlin中来调用一下该Java中的方法 ...

  2. Java调用Kotlin事项及Kotlin反射初步

    继续来研究Java调用Kotlin的一些东东. @Throws注解: 我们知道在Kotlin中是不存在checked exception的,而在Java中是存在的,那..如果从Java来调用Kotli ...

  3. Java泛型-内部原理: 类型擦除以及类型擦除带来的问题

    一:Java泛型的实现方法:类型擦除 大家都知道,Java的泛型是伪泛型,这是因为Java在编译期间,所有的泛型信息都会被擦掉,正确理解泛型概念的首要前提是理解类型擦除.Java的泛型基本上都是在编译 ...

  4. Java中泛型 类型擦除

    转自:Java中泛型是类型擦除的 Java 泛型(Generic)的引入加强了参数类型的安全性,减少了类型的转换,但有一点需要注意:Java 的泛型在编译器有效,在运行期被删除,也就是说所有泛型参数类 ...

  5. Java泛型类型擦除以及类型擦除带来的问题

    目录 1.Java泛型的实现方法:类型擦除 1-2.通过两个例子证明Java类型的类型擦除 2.类型擦除后保留的原始类型 3.类型擦除引起的问题及解决方法 3-1.先检查,再编译以及编译的对象和引用传 ...

  6. 初探Java类型擦除

    本篇博客主要介绍了Java类型擦除的定义,详细的介绍了类型擦除在Java中所出现的场景. 1. 什么是类型擦除 为了让你们快速的对类型擦除有一个印象,首先举一个很简单也很经典的例子. // 指定泛型为 ...

  7. Java泛型-类型擦除

    一.概述 Java泛型在使用过程有诸多的问题,如不存在List<String>.class, List<Integer>不能赋值给List<Number>(不可协变 ...

  8. JAVA类型擦除

    Java泛型-类型擦除 一.概述 Java泛型在使用过程有诸多的问题,如不存在List<String>.class, List<Integer>不能赋值给List<Num ...

  9. Java协变、逆变、类型擦除

    协变.逆变 定义 Java中String类型是继承自Object的,姑且记做String ≦ Object,表示String是Object的子类型,String的对象可以赋给Object的对象.而Ob ...

随机推荐

  1. AIX日志相关的命令

    常用的命令有: 1.列出简短的出错信息 errpt | more 2.列出所有硬件出错信息 errpt -d H 3.列出所有软件错误信息 errpt -d S 4.列出详细的出错信息 errpt – ...

  2. excel 去掉 空单元格

    Excel 2003 选中这一列,定位(CTRL+G)--定位条件--空值--确定--右键--删除. 1. 然后进行全选已输入的内容,可以使用鼠标拖动已输入的内容,也可以使用快捷键全选内容,按住ctr ...

  3. mysql8.0 grant 创建账号及权限记录

    针对 42000错误 原文:https://stackoverflow.com/questions/50177216/how-to-grant-all-privileges-to-root-user- ...

  4. 【ztree】获取根节点

    var node = treeObj.getNodesByFilter(function (node) { return node.level == 0 }, true);

  5. ai切片的完美解决方案

    ai切片的完美解决方案1 背景拖到外面2 导出psd3 ps切片 背景夹层黑色就看清楚啦

  6. Graph machine learning 工具

    OGB: Open Graph Benchmark https://ogb.stanford.edu/ https://github.com/snap-stanford/ogb OGB is a co ...

  7. C语言指针的一些用法

    指针是C语言的灵魂,精华之所在.指针强大而危险,用得好是一大利器,用得不好是一大潜在危害.正是指针具有强大而又危险的特性,加上指针比较难,很多人用的不好,所以越是封装程度高的语言,越是没有指针的&qu ...

  8. 【rt-thread】1、快速建立rt-thread nano最小裁剪工程

    快速建立rt-thread nano最小裁剪工程 使用keil5建立 1.下载rt-thread 3.03版本,3.03程序占用最小 2.使用 CubeMX 配置工程 3.选择添加rt-thread ...

  9. 解决使用RabbitTemplate操作RabbitMQ,发生The channelMax limit is reached. Try later.问题

    使用RabbitTemplate操纵RabbitMQ,每个RabbitTemplate等于一个connection,每个connection最多支持2048个channel,当hannel达到2048 ...

  10. 常用 Maven 仓库地址

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/niuzhucedenglu/article ...