Java與kotlin 互轉
Java檔案
以下是Java檔案,提供二個方法getData()與getNullData(),其中一個有傳回字串,另一個傳回null。
JavaTest.java
1
2
3
4
5
6
7
8
public class JavaTest {
public String getData() {
return "Hello World";
}
public String getNullData() {
return null;
}
}
Kotlin建立Java物件
以下是Kotlin檔案,建立Java物件,不使用new,而是使用()圓括號建立物件。
KotlinTest.kt
1
2
3
fun main() {
val javaTest = JavaTest()
}
Kotlin呼叫Java方法
nullStr會自動轉成String!的型別,代表Java物件傳回的是null。
使用此物件要用問號?,問號代表物件不是null,才可以執行toLowerCase(),否則就不執行,執行時不會有nullpoint Exception。
KotlinTest.kt
1
2
3
4
5
6
fun main() {
val javaTest = JavaTest()
println(javaTest.data)
val nullStr = javaTest.nullData
nullStr?.toLowerCase()
}
Hello World
javaClass取得Java類型
成員變數intValue是int類型。
JavaTest.java
1
2
3
public class JavaTest {
public int intValue = 10;
}
使用javaClass可以知道成員變數intValue的類型。
KotlinTest.kt
1
2
val intValue = javaTest.intValue
println(intValue.javaClass)
int
getter setter 存取
不需要使用get成員變數來存取,直接使用成員變數名來存取。
JavaTest.java
1
2
3
4
5
6
7
8
9
10
11
public class JavaTest {
public String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
KotlinTest.kt
1
2
3
4
5
fun main() {
val javaTest = JavaTest()
javaTest.name = "Mary"
println(javaTest.name)
}
Mary
Java呼叫Kotlin
下方有一個函式名callKotlinFun()。
KotlinTest.kt
1
2
3
4
fun main() {
}
fun callKotlinFun() = "Kotlin Fun data"
呼叫方式: 檔名 + Kt + .函式名()
Java檔案要呼叫KotlinTestKt.callKotlinFun()。
KotlinTest.kt
1
2
3
4
5
public class JavaTest {
public static void main(String[] args) {
System.out.println(KotlinTestKt.callKotlinFun());
}
}
Kotlin Fun data
修改kotlin檔名
語法
@file:JvmName("檔名")
KotlinTest.kt
1
2
3
4
5
@file:JvmName("KotlinTest1")
fun main() {
}
fun callKotlinFun() = "Kotlin Fun data"
JavaTest.java
1
2
3
4
5
public class JavaTest {
public static void main(String[] args) {
System.out.println(KotlinTest1.callKotlinFun());
}
}
Kotlin Fun data
Java存取Kotlin物件成員變數
KotlinTest.kt中有一個類別Students,成員變數nameList。
KotlinTest.kt
1
2
3
4
5
fun main() {
}
class Students {
val nameList = listOf<String>("Mary", "Bill", "Alex")
}
使用Kotlin類別的成員變數,要用get、set。
JavaTest.java
1
2
3
4
5
6
public class JavaTest {
public static void main(String[] args) {
Students students = new Students();
System.out.println(students.getNameList());
}
}
[Mary, Bill, Alex]
@JvmField
使用@JvmField,就可以不用使用get set存取Kotlin類別的成員變數。
KotlinTest.kt
1
2
3
4
5
6
fun main() {
}
class Students {
@JvmField
val nameList = listOf<String>("Mary", "Bill", "Alex")
}
JavaTest.java
1
2
3
4
5
6
public class JavaTest {
public static void main(String[] args) {
Students students = new Students();
System.out.println(students.nameList);
}
}
[Mary, Bill, Alex]
@JvmOverloads
有一個test1()函式,有二個參數,有預設值。
KotlinTest.kt
1
2
3
4
5
fun main() {
}
fun test1(arg1:String = "arg1", arg2:String = "arg2") {
println("arg1 = $arg1, arg2 = $arg2")
}
在Java中無法只用一個參數,需要用2個參數。
JavaTest.java
1
2
3
4
5
public class JavaTest {
public static void main(String[] args) {
KotlinTestKt.test1("test1");
}
}
在Kotlin方法上方加上@JvmOverloads,Java就可以使用一個參數來呼叫Kotlin函式。
KotlinTest.kt
1
2
3
4
@JvmOverloads
fun test1(arg1:String = "arg1", arg2:String = "arg2") {
println("arg1 = $arg1, arg2 = $arg2")
}
JavaTest.java
1
2
3
4
5
public class JavaTest {
public static void main(String[] args) {
KotlinTestKt.test1("test1");
}
}
arg1 = test1, arg2 = arg2