Kotlin代码与Java代码完全兼容。现有的Java代码可以很容易地从Kotlin代码中调用,并且Kotlin代码也可以以普通方式从Java代码中调用。
Kotlin调用Java代码
从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){
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="kwd">add</span><span class="pun">(</span><span class="pln">inta</span><span class="pun">,</span><span class="kwd">int</span><span class="pln"> b</span><span class="pun">){</span><span class="pln">
int result = a + b;
System.out.println("printing inside Java class :"+result);
}
}
输出:
printing inside Java class :15 printing 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){
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> area</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> l</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> b</span><span class="pun">){</span><span class="pln">
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 mykotlinpackage import 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){
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> area</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> l</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> b</span><span class="pun">){</span><span class="pln">
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;
</span><span class="kwd">public</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> getfirstName</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> firstName</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> setfirstName</span><span class="pun">(</span><span class="typ">String</span><span class="pln"> firstName</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
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: Arjun accessing value using property: Kumar accessing value using method: Arjun accessing value using method: Kumar
Kotlin访问Java数组
无涯教程可以简单地调用Java类方法,该方法将数组作为Kotlin文件的参数。例如,创建方法sumValue(),该方法将数组元素作为Java类MyJava.java中的参数来计算加法并返回结果。通过将数组作为参数从Kotlin文件MyKotlin.kt中调用此方法。
MyJava.java
public class MyJava {
</span><span class="kwd">public</span><span class="pln"> intsumValues</span><span class="pun">(</span><span class="kwd">int</span><span class="pun">[]</span><span class="pln"> nums</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
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参数是使用省略号定义的,即数据类型后的三个点(...)。
从Kotlin访问Java varargs时,无涯教程需要使用传播运算符*传递数组。
让无涯教程看一个示例,其中Java方法使用从Kotlin文件调用的int类型varargs。
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) }
输出:
0 1 2 3
让无涯教程看另一个示例,该示例在Java方法中使用两个参数,这些参数用作String类型和从Kotlin文件调用的int类型varargs的参数。
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 hello 0 1 2 3
Kotlin和Java类型映射
Kotlin和Java类型的映射方式不同,但是它们映射至相应的类型。这些类型的映射仅在编译时才重要,并且运行时保持不变。
Java的原始类型到对应的Kotlin类型
| Java type | Kotlin type |
|---|---|
| byte | kotlin.Byte |
| short | kotlin.Short |
| int | kotlin.Int |
| long | kotlin.Long |
| char | kotlin.Char |
| double | kotlin.Double |
| boolean | kotlin.Boolean |
Java的非基本类型与对应的Kotlin类型
| Java type | Kotlin type |
|---|---|
| java.lang.Object | kotlin.Any! |
| java.lang.Cloneable | kotlin.Cloneable! |
| java.lang.Comparable | kotlin.Comparable! |
| java.lang.Enum | kotlin.Enum! |
| java.lang.Annotation | kotlin.Annotation! |
| java.lang.Deprecated | kotlin.Deprecated! |
| java.lang.CharSequence | kotlin.CharSequence! |
| java.lang.String | kotlin.String! |
| java.lang.Number | kotlin.Number! |
| java.lang.Throwable | kotlin.Throwable! |
Java的boxed基本类型与对应的nullableKotlin类型
| Java type | Kotlin type |
|---|---|
| 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 type | Kotlin read-only type | Kotlin mutable type |
|---|---|---|
| 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> |
| Map<K, V> | Map<K, V> | MutableMap<K, V> |
| Map.Entry<K, V> | Map.Entry<K, V> | MutableMap.MutableEntry<K, V> |