类型擦除对Java调用Kotlin的影响
@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的影响的更多相关文章
- Java调用Kotlin程序深度解析
异常: 在之前我们已经学习在Kotlin中的所有异常都是运行期的,而不像Java分为运行期和非运行期,下面用代码来演示一下,先建一个Java的异常: 然后在Kotlin中来调用一下该Java中的方法 ...
- Java调用Kotlin事项及Kotlin反射初步
继续来研究Java调用Kotlin的一些东东. @Throws注解: 我们知道在Kotlin中是不存在checked exception的,而在Java中是存在的,那..如果从Java来调用Kotli ...
- Java泛型-内部原理: 类型擦除以及类型擦除带来的问题
一:Java泛型的实现方法:类型擦除 大家都知道,Java的泛型是伪泛型,这是因为Java在编译期间,所有的泛型信息都会被擦掉,正确理解泛型概念的首要前提是理解类型擦除.Java的泛型基本上都是在编译 ...
- Java中泛型 类型擦除
转自:Java中泛型是类型擦除的 Java 泛型(Generic)的引入加强了参数类型的安全性,减少了类型的转换,但有一点需要注意:Java 的泛型在编译器有效,在运行期被删除,也就是说所有泛型参数类 ...
- Java泛型类型擦除以及类型擦除带来的问题
目录 1.Java泛型的实现方法:类型擦除 1-2.通过两个例子证明Java类型的类型擦除 2.类型擦除后保留的原始类型 3.类型擦除引起的问题及解决方法 3-1.先检查,再编译以及编译的对象和引用传 ...
- 初探Java类型擦除
本篇博客主要介绍了Java类型擦除的定义,详细的介绍了类型擦除在Java中所出现的场景. 1. 什么是类型擦除 为了让你们快速的对类型擦除有一个印象,首先举一个很简单也很经典的例子. // 指定泛型为 ...
- Java泛型-类型擦除
一.概述 Java泛型在使用过程有诸多的问题,如不存在List<String>.class, List<Integer>不能赋值给List<Number>(不可协变 ...
- JAVA类型擦除
Java泛型-类型擦除 一.概述 Java泛型在使用过程有诸多的问题,如不存在List<String>.class, List<Integer>不能赋值给List<Num ...
- Java协变、逆变、类型擦除
协变.逆变 定义 Java中String类型是继承自Object的,姑且记做String ≦ Object,表示String是Object的子类型,String的对象可以赋给Object的对象.而Ob ...
随机推荐
- Win10升级后无法删除Windows.old文件夹
问题:win10系统进行升级后(升级到1903版本),无法删除生成的Windows.old文件夹,提示文件夹访问被拒绝. 点击继续后,无法进行正常删除. 解决方法:使用windows自带的磁盘清理进行 ...
- Centos7中rc.local设置springboot项目开机自启动
在Centos7下,rc.local文件,开机默认是不执行的 1.进入rc.local中 路径如下图
- 神器之strace
原链接:https://www.jianshu.com/p/33521124bdf2来
- 构建一个java环境的centos系统镜像并上传到阿里云镜像仓库
编辑dockerfile 文件 FROM centos MAINTAINER zhaoweifeng ENV LANG en_US.UTF-8 RUN /bin/cp /usr/share/zonei ...
- JDK本地内存追踪NMT
通常情况下, JVM占用的内存不仅仅是-Xmx, -Xms等指定的大小, 因为JVM也是一个应用, 它需要额外的空间去完成它的工作, 除了堆外, JVM会分配内存的地方包括以下这些: Metaspac ...
- Django框架之第三篇(路由层)--有名/无名分组、反向解析、路由分发、名称空间、伪静态
一.Django请求生命周期 二.路由层 urls.py url()方法 第一个参数其实就是一个正则表达式,一旦前面的正则匹配到了内容,就不会再往下继续匹配,而是直接执行对应的视图函数. djang ...
- me.chanjar.weixin.common.error.WxErrorException: {"errcode":40013,"errmsg":"invalid appid hint: [xxxxxxxxxx]"}
错误解决思路: 1.看看appid和appsecret的配置信息是否正确 2.查看前后端通信的http或者https协议是否正确( http://xxxxxxx 写成https://xxxxxxx)
- Mybatis自动生成代码工具
项目结构如下 一:在POM中添加mybatis-generator-maven-plugin 插件 <plugins> <plugin> <groupId>org. ...
- Rust 智能指针(二)
1. Rc<T> 引用计数指针 Rc<T> 是引用计数指针,可以使用clone使得指针所指向的数据具有多个所有者. enum List { Cons(i32, Rc<Li ...
- Python-记事本
1.文本颜色 格式:\[显示方式;前景色;背景色m要打印的字符串\[0m 2.format 格式 print('{}的三次方为{:*^20}'.format(a,pow(a, 3))) print(& ...