Kotlin代碼與Java代碼完全相容。 Java代碼在Kotlin代碼中輕鬆調用,Kotlin代碼也可以通過Java代碼的正常方式調用。
從Kotlin調用Java代碼
從Kotlin檔調用Java void方法
從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檔調用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 a, int b){
int result = a * b;
return result;
}
}
運行代碼:MyKotlinFile.kt ,得到以下結果 -
printing area from java insideKotlin file: 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.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 getter和setter
由於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
Kotlin代碼訪問Java數組
可以簡單地調用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
Kotlin代碼訪問Java可變參數
在Java可變參數函數中,可以將任意數量的參數傳遞給方法。 Java可變參數使用省略號定義,即數據類型後的三個點(...
)。
使用可變參數(varargs)時,應注意以下幾點:
- 方法中只有一個可變參數(varargs)。
- 可變參數(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映射類型
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> |