类型擦除对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 ...
随机推荐
- 【视频开发】ONVIF客户端搜索设备获取rtsp地址开发笔记(精华篇)
转载地址:http://blog.csdn.net/gubenpeiyuan/article/details/25618177 概要: 目前ONVIF协议家族设备已占据数字监控行业 ...
- [转] spring-boot集成swagger2
经测,spring-boot版本使用1.5.2+时需使用springfox-swagger2版本2.5+(spring-boot 1.2 + springfox-swagger2 2.2 在未扫描ja ...
- JS系列:编程语言
1.编程语言 html+css标记语言 js:轻量级的交互语言->全栈编程语言 - 面向对象: + C++ + JAVA + PHP + C# (.net doc) + JS - 面向过程 + ...
- vs code 自定义配置记录
java环境安装:https://devblogs.microsoft.com/visualstudio/announcing-visual-studio-code-java-installer/ 保 ...
- Java开发笔记(一百五十一)Druid连接池的用法
C3P0连接池自诞生以来在Java Web领域反响甚好,业已成为hibenate框架推荐的连接池.谁知人红是非多,C3P0在大型应用场合中暴露了越来越多的局限性,包括但不限于下列几点:1.C3P0管理 ...
- grpc Unary模式下客户端创建insecure channel的主要流程
(原创)C/C/1.25.0-dev grpc-c/8.0.0, 使用的例子是自带的例子GreeterClient grpc Unary模式下客户端创建insecure channel的主要流程 gr ...
- 《算法图解》全本PDF下载附百度云链接
作者使用Python和图画来解释算法,找了好久才找到PDF版本,末尾附百度云链接~ 作者[美]Aditya Bhargava 译者袁国忠 类别 出版 / 非虚构 出版社人民邮电出版社 / 2017-0 ...
- C 语言 基础篇
1.机器语言 2.汇编语言 3.高级语言:C.C++.Java(基于虚拟机) C语言开发:Unix,Linux,Mac OS,iOS,Android,Windows,Ubuntu 开发环境:visua ...
- 【基本知识】UART接口
1.简介 (1)UART一种通用异步串口数据总线,最低采用两路信号(TX/RX)即可实现全双工通信,十分简单: (2)UART采用LSB模式传输,串口数据传输格式如下图所示: 起始位:长度为1位的时间 ...
- HBase 系列(一)—— HBase 简介
一.Hadoop的局限 HBase 是一个构建在 Hadoop 文件系统之上的面向列的数据库管理系统. 要想明白为什么产生 HBase,就需要先了解一下 Hadoop 存在的限制?Hadoop 可以通 ...