從Kotlin調用Java代碼
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>