Kotlin 调用 Java

比如如下 Java 类:

public class Person{private String name;private boolean married;private int age;......
}

在 kotlin 中调用 Person:

fun main(args:Array<String>){val list = ArrayList<String>// 调用 Java 类 array listlist.add("hello")list.add("world")for(item in list){// 快速迭代println(item)}for(i in 0 until list.size){// Range println(list[i])}val person = Person()person.age = 20 // 调用 Person 的 set 方法person.isMarried = false // Boolean 属性的 set 方法稍有区别person.name = "zhangsan"println(person.age) // 调用 get 方法println(person.isMarried) // Boolean 的 get 方法println(person.name)
}

平台类型

在 kotlin 中为了解决 Java 中所有引用类都是可控类型的问题,将所有来自于 java 平台类型称为平台类型(platform types)。对这种类型kotlin 不再执行严格的非空检查。

val list = ArrayList<String>() // ArrayList 属于“平台类型”
list.add("victor") // 如果没有此句,则 list[0] 会导致下标越界
val size= list.size
val item = list[0] // item 的类型依赖于类型推断val str: String? = item // item 可以为空
var str1: String = item // item 是一个平台类型,在编译期 Kotlin 放弃非空检查,所以不会报错,但是运行期有可能把 null赋给 str1从而出错

数组在 kotlin 中是 不变 ,即不支持协变/逆变(out/in)。但 java 不同:

public class MyTest{public static void main(String[] args){Object[] objects = new String[2]; // 产生协变。将一个 子类 赋给了父类。objects[0] = 1; // 编译通过,但运行时异常。objects[1] = 2;}
}

Kotlin 中的数组更加安全,它不允许协变/逆变,你无法将一个 Array 赋给 Array(编译不通过)。数组参数也是如此。Java 中,允许将一个String[] 作为参数传给方法中的 Object[] 参数,而 kotlin 不行。除非这个方法是一个 Java 方法,这个时候可以将 Ar ray 传参给 Object[]。

在 java 中,原生类型数组,比如 int[] 可以降低装箱操作的性能开销。为了和 java 兼容,kotlin 提供了 IntArray,DoubleArray,CharArray 等原生类型数组(它们跟 Array 没有任何继承关系)来达到同样的目的。

Java 类:

public class MyArray {public void myArrayMethod(int[] args){// 原生数组}
}

Kotlin 代码

fun main(args: Array<String>){// 调用 java 方法val myArray = MyArray()val intArray = intArrayOf(1,2,3) // 返回一个 IntArray,避免装箱拆箱操作val a = arrayOf(1,3,5) // Array<Int> 类型,对应 Java 的 Integer[]myArray.myArrayMethod(intArray) // 用 IntArray 对应 java 的 int[]array[0] = array[0]*2
}

kotlin 编译器会优化数组访问,从而降低性能开销。比如上面 array[0] = array[0]*2 这句并不会调用 get/set 方法,而是直接通过索引访问元素。

可变参数

java 中可变参数实质上就是数组,即可以通过数组方式传参,也可以通过列表方式传参。

public class MyClass {public void method( String... strings){}
}

在 kotlin 中调用这个方法必须要使用特殊的写法:

val myClass = MyClass()
val stringArrays = arrayOf("No 1", "over world")myClass.method(*stringArrays)// java 的 String... 对应为 kotlin 的 String!

* 操作符叫做 打伞 操作,将一个String数组转变成 String! 类型。

运行时异常

Java 中存在两种异常:运行时异常和非运行时异常,但在 kotlin 中,只有运行时异常。如果 java 方法抛出了一个非运行期异常,

public class MyException {public void method() throws IOException {throw new IOException("I/O 异常");}
}

在 kotlin 中调用该方法时,kotlin 不会强制要求你捕获这个异常:

val myException = MyException()
myException.mothod() // 编译通过

获取对象的 java 类

val clazz = MyException()::class.java // 获得实例对象对应的 java class
println(clazz) // 打印:class com.xxxx.yyy.MyException

另外一种方式:

val clazz = MyException().javaClass // 获得某实例对象对应的 java class
println(clazz) // 打印:class com.xxxx.yyy.MyException

kotlin与Java之间的骚操作:kotlin一键调用java相关推荐

  1. CORBA 简单了解和JAVA与C++互操以及C++调用Java web service

    CORBA了解 CORBA(Common Object Request Broker Architecture, 公共对象请求代理体系结构)是由OMG(对象管理组织,Object Management ...

  2. android jni 调用java对象_Android NDK开发之Jni调用Java对象

    本地代码中使用Java对象 通过使用合适的JNI函数,你可以创建Java对象,get.set 静态(static)和 实例(instance)的域,调用静态(static)和实例(instance)函 ...

  3. c#调用java开发的webservice_用C#.NET调用Java开发的WebService传递int,double问题

    用C#.NET调用Java开发的WebService时,先在客户端封装的带有int属性的对象,当将该对象传到服务器端时,服务器端可以得到string类型的属性值,却不能得到int类型.double和D ...

  4. Java传xml时字符串乱码_php调用java传递xml字符串乱码怎么办

    php调用java传递xml字符串乱码的解决办法:首先使用CURL在命令行中完成请求:然后将调用接口时的[Content-Type:application/json]改成[application/xm ...

  5. android jni c调用java,Android学习JNI,使用C调用JAVA语言

    本节学习使用C语言调用JAVA语言.在生活中比如我们某些底层的硬件必须使用C语言去编写,当C语言返回的某些数值显示在界面上时,就比如使用JNI.这样可以将C返回的值显示在界面上. 本节模拟传感器返回的 ...

  6. java sorted 方法_多个.sorted(…)调用java 8流

    我有一个我想要自然排序的对象流,但也强迫其中一个成员永远是第一个. 例如: List result = Stream.of("a", "s", "d& ...

  7. iapp对应java代码,『iApp代码』iApp调用java获取本软件版本号

    所需工具: 1.手机 2.iApp 3.手 4.脑子 教程开始 第一步: 创建一个名叫java的mjava模块 写入代码: import android.content.pm.PackageInfo; ...

  8. 【Kotlin】apply 内联扩展函数 ( apply 函数原型 | apply 函数示例 | Kotlin 调用 Java API )

    文章目录 I . 内联扩展函数 apply II . Kotlin 调用 Java API III . apply 内联扩展函数示例 ( 调用 Java API 处理图像 ) I . 内联扩展函数 a ...

  9. java导入导出excel操作(jxl)

    java导入导出excel操作(jxl) Java解释Excel数据(jxl.jar包的使用) 关键字: java excel jxl.jar jxl.jar 包 下载地址: http://www.a ...

最新文章

  1. 对python里的装饰器
  2. php csrf攻击 xss区别,用大白话谈谈XSS与CSRF
  3. 《C champion》C语言发展
  4. Self Crossing
  5. [html] 字体图标加载出来成了小方块,是什么原因呢?如何解决?
  6. Python__getattr__、__setattr__、__delattr__、__getitem__、__setitem__、__getattribute__方法的理解
  7. 微信小程序云开发之云函数创建
  8. Docker 构建 redis 集群
  9. 10元/小时?大涨价后,共享充电宝行业迎来“大地震”!
  10. mysql 查询排序位置_MySQL-基础查询与排序
  11. Windows域策略 设置客户端服务启动状态 【全域策略生效】
  12. comsol分析时总位移代表什么_通过仿真分析球形盖的变形问题
  13. axios get请求添加去缓存
  14. 基于JavaEE的公共自行车租赁管理系统_JSP网站设计_SqlServer数据库设计
  15. 大麦无线虚拟服务器,解答大麦盒子无线设置的问题
  16. PKPM200608/CARD-1 8.0/TPM5000/神机妙算(黄狗)/桥梁通7.09/福莱一点通8.3/纬地5.82
  17. pycharm安装jpype报错及解决方法
  18. android身高控件_Android 滑动选择身高体重控件——RulerView
  19. 多多云手机【语音引流】创新吸粉模式 -- 语音播放功能模块开发教程
  20. cadence PCB边框(Outline)加倒角

热门文章

  1. Jquery考试面试题(一)
  2. CeisumLabApkServe--为CeisumLab工具下载地图,影像数据的.pak文件架设地图服务
  3. MACD与OBV结合,用OBV进行改进MACD指标公式
  4. MacBook安装Windows系统后耗电快的原因在这里
  5. Kryo:快速、高效的序列化框架
  6. Itunes制作手机铃声,图文版
  7. 一台计算机连接两个投影,事实:如何将两个外接显示器连接到笔记本电脑以同时实现三个屏幕?...
  8. 计算机操作系统——LINUX的C语言编程与shell编程
  9. 项目中常用的Util方法
  10. PS 切图 保存图片