Kotlin程式碼與Java程式碼完全相容。 Java程式碼在Kotlin程式碼中輕鬆呼叫,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){
}
public static void add(int a,int b){
int result = a + b;
System.out.println("printing inside Java class :"+result);
}
}
執行程式碼:MyKotlinFile.kt ,得到以下結果 -
printing inside Java class :15
printing sum inside Kotlin file: kotlin.Unit
在從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 a, int b){
int result = a * b;
return result;
}
}
執行程式碼:MyKotlinFile.kt ,得到以下結果 -
printing area from java insideKotlin file: 12
如果想要從Kotlin檔案呼叫存在於不同包中的Java程式碼,則需要在Kotlin檔案中使用Java類匯入包名。
例如,一個Java類MyJavaClass.java
存在於一個包myjavapackage
中,一個Kotlin檔案MyKotlinFile.kt
存在於mykotlinpackage
包中。 在這種情況下,從Kotlin檔案呼叫Java程式碼需要在Kotlin檔案中匯入myjavapackage.MyJavaClass
包。
程式碼檔案:MyKotlinFile.kt
package mykotlinpackage
import myjavapackage.MyJavaClass
fun main(args: Array<String>) {
val area: Int = MyJavaClass.area(3, 6)
println("printing area from java insideKotlin file: "+area)
}
程式碼檔案:MyJavaClass.java
package myjavapackage;
public class MyJavaClass {
public static void main(String[] args){
}
public static int area(int a, int b){
int result = a * b;
return result;
}
}
執行程式碼:MyKotlinFile.kt ,得到以下結果 -
printing area from java insideKotlin file: 18
由於Kotlin與Java完全互操作,在Kotlin可以存取Java類(或POJO
類)的getter
和setter
方法。例如,在Java類MyJava.java
中建立一個getter
和setter
方法,用於設定和讀取firstName
和lastName
屬性。 從Kotlin檔案通過使用MyJava.java
類來建立物件,在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 = "Max"
myJava.setfirstName("Su")
println("使用屬性存取值: "+myJava.firstName)
println("使用屬性存取值: "+myJava.lastName)
println("------------------------------------")
println("使用方法存取值: "+myJava.getfirstName())
println("使用方法存取值: "+myJava.getlastName())
}
執行程式碼:MyKotlin.kt ,得到以下結果 -
使用屬性存取值: Su
使用屬性存取值: Max
------------------------------------
使用方法存取值: Su
使用方法存取值: Max
可以簡單地呼叫Java類方法,該方法將陣列作為Kotlin檔案中的引數。 例如,建立方法sumValue()
,它將陣列元素作為Java類MyJava.java
中的引數計算加法並返回結果。 通過將陣列作為引數傳遞,從Kotlin檔案MyKotlin.kt
呼叫此方法。
檔案:MyJava.java -
public class MyJava {
public int sumValues(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)
}
執行程式碼:MyKotlin.kt ,得到以下結果 -
陣列元素總和:15
在Java可變引數函式中,可以將任意數量的引數傳遞給方法。 Java可變引數使用省略號定義,即資料型別後的三個點(...
)。
使用可變引數(varargs)時,應注意以下幾點:
在從Kotlin存取Java可變引數(varargs)時,需要使用運算子*
來傳遞陣列。
下面來看看一個從Kotlin檔案呼叫Java方法使用int
型別可變引數(varargs)的範例。
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)
}
執行程式碼:MyKotlin.kt ,得到以下結果 -
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)
}
執行程式碼:MyKotlin.kt ,得到以下結果 -
string is hello
0
1
2
3
Kotlin和Java型別的對映方式不同,但它們都能對映到相應的型別。 這些型別的對映僅在編譯時才有意義,執行時保持不變。
Java的原始型別對應的Kotlin型別
Java型別 | Kotlin型別 |
---|---|
byte |
kotlin.Byte |
short |
kotlin.Short |
int |
kotlin.Int |
long |
kotlin.Long |
char |
kotlin.Char |
double |
kotlin.Double |
boolean |
kotlin.Boolean |
Java非原始型別對應的Kotlin型別
Java型別 | Kotlin型別 |
---|---|
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盒裝原始型別和相應的可空Kotlin型別
Java型別 | Kotlin型別 |
---|---|
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> |
Map<K, V> |
Map<K, V> |
MutableMap<K, V> |
Map.Entry<K, V> |
Map.Entry<K, V> |
MutableMap.MutableEntry<K, V> |