💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
### 在Kotlin中调用Java #### 调用Java中的getter/setter方法 一般情况下,在Kotlin中操作Java中的Bean类属性时,程序会自动识别Bean类中属性对应的getter和setter方法,直接通过属性就可以修改对应的私有属性值。接下来我们通过一个案例来演示在Kotlin中调用Java中的Bean类。 1. 创建Student.java 在IDEA中创建一个名为Chapter12的项目,包名指定为com.itheima.chapter12,该包用于存放后续案例中创建的文件,接着在该包中创建一个Student.java文件。具体代码如【文件12-1】所示。 【文件12-1】Student.java ``` public class Student { private String name; public Student(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } } ``` 上述代码中,在Student类中创建了一个字段name,该字段用于设置学生姓名,并且在这个类中同时创建了getName()和setName()方法,这两个方法分别用于获取和设置Student中的name字段。 2. 创建SettingName.kt 创建一个SettingName.kt文件,在该文件的main()方法中调用Java中创建的Student类,具体代码如【文件12-2】所示。 【文件12-2】SettingName.kt ``` fun main(args: Array<String>) { val stu = Student("皮皮") stu.name = "多多" //直接设置属性值 println(stu.name) //直接通过属性访问 stu.setName("乐乐") //通过setter方法设置属性值 println(stu.getName()) //通过getter方法获取属性值 } ``` 运行结果: ``` 多多 乐乐 ``` #### 调用Java中的@NotNull注解 在Java中任何类型都可以为空,也就是任何引用都可能是Null,但是在Kotlin中却需要明确指定某个类型为空或者为非空,如果为非空时,则传递Null时程序会报错;如果为空时,则可以传递Null。因此如果在Kotlin中调用Java中的对象时可能会出现空安全的问题,为了解决空安全问题,有以下两种方法。 第1种:在Java中声明的类型,在Kotlin中会被特别对待并称为“平台类型(Platform Type)”,在Kotlin中对于这种类型的空检查会放宽,因此它们的安全保存与在Java中相同,在调用该类型的方法时可以加上空安全调用符。 第2种:在Java中,给构造方法或者普通方法指定的参数使用@NotNull注解,强制传入不为空的数据。 接下来我们通过一个案例来演示在Kotlin中调用Java中的NotNull对象。 1. 创建Person.java 创建一个Person.java文件,在该文件中创建两个字段,分别是name和age,name表示的是名字,age表示的是年龄。具体代码如【文件12-3】所示。 【文件12-3】Person.java ``` import com.sun.istack.internal.NotNull; public class Person { private String name; private int age; public Person(@NotNull String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } ``` 2. 创建Main.kt 创建一个Main.kt文件,在该文件中调用Person中的构造方法并设置对应参数的值。具体代码如【文件12-4】所示。 【文件12-4】Main.kt ``` fun main(args: Array<String>) { var person = Person("皮皮", 20) println(person.name) println(person.name?.length) //使用空安全调用符调用 } ``` ``` 运行结果: 皮皮 2 ``` 在上述代码中,Person的构造方法中传递的参数name前添加了@NotNull注解,该注解强制传递的name参数不为Null,如果在调用构造方法赋值的过程中传递的name参数为Null时,编译器会报错。并且在上述第5行代码中,在使用name?.length时添加了空安全调用符,防止出现异常。 #### 调用Java中的静态成员 在Java中,静态成员在编译时会生成该类的伴生对象,因此在Kotlin中可以直接以显示的方式访问Java中的静态成员。接下来我们通过一个案例来演示在Kotlin中访问Java中的静态成员。 1. 创建JavaStatic.java 创建一个JavaStatic.java文件,并在该文件中创建一个静态成员变量name,与一个静态方法sayHello(),具体代码如【文件12-5】所示。 【文件12-5】JavaStatic.java ``` public class JavaStatic { public static String name = "皮皮"; //创建静态变量name public static void sayHello() { //创建静态方法sayHello() System.out.println("Hello World"); } } ``` 2. 创建KotlinStatic.kt 创建一个KotlinStatic.kt文件,直接访问JavaStatic类中的静态成员变量和方法,具体代码如【文件12-6】所示。 【文件12-6】KotlinStatic.kt ``` fun main(args: Array<String>) { JavaStatic.name JavaStatic.sayHello() } ``` 运行结果: ``` Hello World ``` #### SAM转换 在Kotlin中,函数可以作为参数来使用,但是在Java中不支持函数作为参数这种形式。通常在Java中,如果需要实现这一功能,则需要将实现这个功能的动作放在接口的实现类中,然后将这个实现类的实例传递给其他方法。 在Java中,只有一个抽象方法的接口被称为SAM(Single Abstract Method)类型接口,即函数式接口,如Runnable接口。Kotlin支持SAM转换。接下来我们通过一个案例来演示SAM的转换。 1. 创建SAM.java 创建一个SAM.java文件,在该文件中创建一个SAM类,这个类中定义一个接口Listener,在该接口中设置一个方法onClick(),具体代码如【文件12-7】所示。 【文件12-7】SAM.java ``` public class SAM { private Listener listener; public void setListener(Listener listener) { this.listener = listener; } interface Listener { void onClick(String s); } } ``` 2. 创建SAM.kt 创建一个SAM.kt文件,在这个文件中使用SAM转换来实现Java中的接口,具体代码如【文件12-8】所示。 【文件12-8】SAM.kt ``` fun main(args: Array<String>) { val sam = SAM() //Kotlin中正常调用接口 sam.setListener(object : SAM.Listener { override fun onClick(s: String?) { } }) //使用SAM 转换调用接口 sam.setListener(SAM.Listener { }) //SAM 转换也可以简写为以下形式 sam.setListener { } } ``` >[info] **注意** > > :-: **SAM转换的适用条件** > > (1)SAM转换只适用于接口,而不适用于抽象类,即使这些抽象类中也只有一个抽象方法。 (2)SAM转换只适用于与Java进行互操作,由于Kotlin中有合适的函数类型,因此不需要将函数自动转换为Kotlin接口来实现。