Java和Kotlin互相调用需要注意的问题
来源:互联网 发布:操作系统调度算法代码 编辑:程序博客网 时间:2024/06/16 22:11
kotlin和java虽然100%互通,但是其实还是要注意一些问题,这里总结一下。
Java调用Kotlin
顶层函数和属性
kotlin有顶层方法和属性,java没有,首先Test.kt文件中中定义的顶层方法以及属性
package kotlin/** Created by TY on 2017/7/20.*/var name:String="";const val name1="2";fun test(){}fun main(args: Array<String>) {}
在java中会自动生成一个TestKt类,直接调用即可。
package java;import kotlin.TestKt;/** Created by TY on 2017/7/28.*/class Main { public static void main(String args[]) { TestKt.test(); TestKt.setName("1"); String a =Hello.name1; }}
这里的const关键字的用法相当于public static final ,注意const的限制:
1.只要出现在最顶层或对象内部
2.只支持String与原始类型
3.无法算自定义getter
如果想指定生成的类名,要用到注解 @file:JvmName()
,放在package之前
@file:JvmName("Hello")package kotlin
也就是要写成这样,剩下的就直接改变代码里的类名就可以了。
多个文件协调
如果有AUtils.kt有一个a方法,BUtils.kt有一个b方法如果要协调成一个java类在java使用,在两个kt文件中添加
@file:JvmName("Utils")@file:JvmMultifileClass
这样Java中就可以通过Utils.xx()来进行调用。
不同类型的同名扩展方法
@JvmName("test1")fun String.test() {}fun Int.test() {}
同样可以通过JvmName来指定方法名字。
kotlin中的类
在Kotlin中声明A类
class A(name: String) { //public final //在java中具有与kotlin中一样的可见性 @JvmField val name = name companion object Jvm { val id = "2" }}
Java中调用
n = new A("1").name;//使用kotlin伴生对象 A.Jvm.getId();
注释写的比较明确了就不过多解释了,如果伴生对象没用名字,java中默认是Companion。这个是类的伴生对象,对呀顶层的伴生对象。
object B { val id = "1"}
Java中调用是
//使用kotlin声明对象B.INSTANCE.getId();
kotlin中的默认参数
@JvmOverloadsfun func(name: String = "", id: Int = 1) {}
注意这个注解,在java中会生成方法重载,方法调用我就不写了。
kotlin中的异常
kotlin中抛出异常要在java中检验同样需要加注解
@Throws(IOException::class)fun ex() { throw IOException("")}
Java调用这个方法时IDE就会提示抛出异常了。
Kotlin调用Java
javaClass
public class JavaClass { public static void is() { } public static void object() { } public static void array(int[] a) { array2(a); } public static void array2(int... a) { } public void invoke() { }}
首先是前面两个方法,方法名与关键字冲突,调用的时候要加上``
//使用由kotlin关键字为名字的方法或者属性JavaClass.`is`()JavaClass.`object`()
接着要注意的可变长参数的用法,传数组需要加上*
//java数组与可变长度参数JavaClass.array(intArrayOf(1, 2, 3))JavaClass.array2(*intArrayOf(1, 2, 3))JavaClass.array2(1,2,2);
操作符重载的方法确定
//如果java定义的函数的函数名在kotlin当中与操作符重载方法的方法名一致 则可以使用操作符调用相应的java方法 val j = JavaClass() j()
相当于调用了java类中的invoke()方法
jni的方法定义,external关键字
external fun sum(x: Int, y: Int): Int
总结到这里,实际场景几乎都包括了,到此结束。
- Java和Kotlin互相调用需要注意的问题
- Android开发,Kotlin的了解与学习(八)-----kotlin与java的互相调用
- Kotlin的互操作——Kotlin与Java互相调用
- _stdcall 调用需要注意的问题
- JavaScript 和 java 的互相调用
- Kotlin最简单的入门教程——与Java互相调用
- java classpath配置需要注意的问题
- Java.lang.Process需要注意的问题
- NodeJs安装和需要注意的问题
- 分布式需要注意的问题和解决办法
- 调用API函数FindExecutable和CreateProcess时需要注意的问题。
- Kotlin 和 Java 相互调用
- list和数组互相转化的的方法及需要注意的点!!!
- 需要注意的问题
- 需要注意的问题
- 使用C#异步调用WebServices时需要注意的问题
- XMLHttp连续调用SEND需要注意的问题
- jQuery调用WCF需要注意的一些问题
- Android中.9图片的说明和绘制
- [STM32][基础]GPIO流水灯
- CodeForces Round #223 div.1 D.Sereja and Cinema(组合计数)
- 《Python基础教程第2版》之列表和元组
- ubuntu下QT、qtcreator安装卸载与配置
- Java和Kotlin互相调用需要注意的问题
- php 权限
- 75. Sort Colors 快速排序
- POJ-2377--Bad Cowtractors---最大生成树
- bzoj 2843: 极地旅行社
- Error:(54) Tag <uses-permission> attribute name has invalid character '-'.
- xmapp 配置
- CP2K4.1-release & 最新5.x-development 多进程多线程(MPI+OPENMP) (psmp版 & popt版)超详细编译安装教程极致优化加速版(全编译器可编译版)
- Lua 之使用 VS 生成解释器、编译器和链接库