Java互操作性

本文概述

  • 从Kotlin调用Java代码
  • 包中存在Kotlin代码调用Java类
  • Kotlin代码访问Java getter和setter
  • Kotlin代码访问Java数组
  • Kotlin代码访问Java Varargs
  • Kotlin和Java映射类型
Kotlin代码与Java代码完全兼容。现有的Java代码可以很容易地从Kotlin代码中调用, 并且Kotlin代码也可以以普通方式从Java代码中调用。
从Kotlin调用Java代码调用Java void方法表单Kotlin文件
从Kotlin调用其返回类型为void的Java代码时, 它将在Kotlin文件中返回Unit。如果有人想返回该值, 它将由Kotlin编译器分配给Kotlin文件并返回Unit。例如:
MyKotlinFile.kt
fun main(args: Array< String> ) {val sum= MyJavaClass.add(5, 10)println("printing sum inside Kotlin file: "+sum) }

MyJavaClass.java
public class MyJavaClass {public static void main(String[] args){}public static void add(inta, int b){int result = a + b; System.out.println("printing inside Java class :"+result); }}

输出:
printing inside Java class :15printing sum inside Kotlin file: kotlin.Unit

从Kotlin文件中调用Java int方法
从Kotlin文件中调用int类型或其他(而不是void)的Java代码时, 它以相同类型返回结果。例如, 从Kotlin文件中调用Java类的area()方法将返回int类型的结果。
MyKotlinFile.kt
fun main(args: Array< String> ) {val area: Int = MyJavaClass.area(3, 4)println("printing area from java insideKotlin file: "+area)}

MyJavaClass.java
public class MyJavaClass {public static void main(String[] args){}public static int area(int l, int b){int result = l * b; return result; }}

输出:
printing area from java insideKotlinfile: 12

包中存在Kotlin代码调用Java类如果我们想从不同的包中都存在的Kotlin文件中调用Java代码, 则需要使用Kotlin文件中的Java类导入包名称。
例如, Java类MyJavaClass.java存在于包myjavapackage中, 而Kotlin文件MyKotlinFile.kt存在于mykotlinpackage包中。在这种情况下, 从Kotlin文件中调用Java代码需要在Kotlin文件中导入myjavapackage.MyJavaClass。
MyKotlinFile.kt
package mykotlinpackageimport myjavapackage.MyJavaClassfun main(args: Array< String> ) {val area: Int = MyJavaClass.area(3, 4)println("printing area from java inside Kotlin file: "+area)}

MyJavaClass.java
package myjavapackage; public class MyJavaClass {public static void main(String[] args){}public static int area(int l, int b){int result = l * b; return result; }}

输出:
printing area from java inside Kotlin file: 12

Kotlin代码访问Java getter和setter由于Kotlin与Java具有完全的互操作性, 因此我们可以访问Java类(或POJO类)的getter和setter功能。例如, 在Java类MyJava.java中使用属性firstName和lastName创建一个getter和setter方法。可通过Kotlin文件中的MyJava.java的创建对象从Kotlin文件MyKotlin.kt访问这些属性。
MyJava.java
public class MyJava{protected String firstName; protected String lastName; public String getfirstName() {return firstName; }public void setfirstName(String firstName) {this.firstName = firstName; }public String getlastName() {return lastName; }public void setlastName(String lastName) {this.lastName = lastName; }}

MyKotlin.kt
fun main(args: Array< String> ) {val myJava = MyJava()myJava.lastName = "Kumar"myJava.setfirstName("Arjun")println("accessing value using property: "+myJava.firstName)println("accessing value using property: "+myJava.lastName)println("accessing value using method: "+myJava.getfirstName())println("accessing value using method: "+myJava.getlastName())}

输出:
accessing value using property: Arjunaccessing value using property: Kumaraccessing value using method: Arjunaccessing value using method: Kumar

Kotlin代码访问Java数组我们可以简单地调用Java类方法, 该方法将数组作为Kotlin文件的参数。例如, 创建方法sumValue(), 该方法将数组元素作为Java类MyJava.java中的参数来计算加法并返回结果。通过将数组作为参数从Kotlin文件MyKotlin.kt中调用此方法。
MyJava.java
public class MyJava {public intsumValues(int[] nums) {int result = 0; for (int x:nums) {result+=x; }return result; }}

MyKotlin.kt
fun main(args: Array< String> ){val myJava = MyJava()val numArray = intArrayOf(1, 2, 3, 4, 5)val sum = myJava.sumValues(numArray)println(sum)}

输出:
sum of array element is 15

Kotlin代码访问Java Varargs在Java varags功能中, 我们可以将任意数量的参数传递给方法。 Java varargs参数是使用省略号定义的, 即数据类型后的三个点(… )。
使用varargs参数时, 请注意以下几点:
  • 一个方法中只有一个varargs参数。
  • Varargsagrument必须位于最后一个参数。
从Kotlin访问Java varargs时, 我们需要使用传播运算符*传递数组。
让我们看一个示例, 其中Java方法使用int类型varargs, 该类型从Kotlin文件中调用。
MyJava.java
public class MyJava {public void display(int... values) {for (int s : values) {System.out.println(s); }}}

MyKotlin.kt
fun main(args: Array< String> ){val myJava = MyJava()val array = intArrayOf(0, 1, 2, 3)myJava.display(*array)}

【Java互操作性】输出:
0123

让我们看看另一个示例, 该示例在Java方法中使用两个参数, 这些参数用作从Kotlin文件调用的String类型和int类型的v??arargs的参数。
MyJava.java
public class MyJava {public void display(String message, int... values) {System.out.println("string is " + message); for (int s : values) {System.out.println(s); }}}

MyKotlin.kt
fun main(args: Array< String> ){val myJava = MyJava()val array = intArrayOf(0, 1, 2, 3)myJava.display("hello", *array)}

输出:
string is hello0123

Kotlin和Java映射类型Kotlin和Java类型的映射方式不同, 但是它们映射至相应的类型。这些类型的映射仅在编译时才重要, 并且运行时保持不变。
Java的原始类型到对应的Kotlin类型
Java类型 科特林型
byte kotlin.Byte
short kotlin.Short
int kotlin.Int
long 长科特林
char kotlin.Char
double kotlin.Double
boolean kotlin.Boolean
Java的非基本类型到对应的Kotlin类型
Java类型 科特林型
java.lang.Object 科特林。
java.lang.Cloneable kotlin.Cloneable!
java.lang.Comparable kotlin可比!
java.lang.Enum Kotlin.Enum!
java.lang.annotation中 kotlin.Annotation!
java.lang.Deprecated kotlin。已弃用!
java.lang.CharSequence kotlin.CharSequence!
java.lang.String kotlin.String!
java.lang.Number kotlin.Number!
java.lang.Throwable kotlin.Throwable!
Java的盒装基本类型与对应的nullableKotlin类型
Java类型 科特林型
java.lang.Byte中 kotlin.Byte?
java.lang.Short kotlin.Short?
java.lang.Integer kotlin.Int?
java.lang.Long kotlin.Long?
java.lang.Character kotlin.Char?
java.lang.Float kotlin.Float?
java.lang.Double Kotlin.Double?
java.lang.Boolean kotlin.Boolean?
Java的集合类型为对应的只读或可变Kotlin类型
Java类型 Kotlin只读类型 Kotlin可变型
Iterator< T> Iterator< T> MutableIterator< T>
Iterable< T> Iterable< T> MutableIterable< T>
Collection< T> Collection< T> MutableCollection< T>
Set< T> MutableSet< T> MutableSet< T>
List< T> MutableList< T> MutableList< T>
ListIterator< T> ListIterator< T> MutableListIterator< T>
映射< K, V> 映射< K, V> MutableMap < K, V>
Map.Entry < K, V> Map.Entry < K, V> MutableMap.MutableEntry < K, V>

    推荐阅读