天天看点

Kotlin与Java的共存-kotlin调用java代码

    • kotlin调用javabean数据实体类
    • kotlin的空安全问题
    • 空安全限定不能为NULL
    • kotlin和java中泛型的差异问题
    • SAMConversion在kotlin中调用java的坑

javabean实体类
public class DataClass {
    private int id;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
}
           
kotlin中的调用赋值:
fun main(args: Array<String>) {
    val data=DataClass()
    data.id=1//直接把java中的getset方法转换成了kotlin中的属性
    println(data.id)
//    结果:1
}           

java中返回值为null的方法
public class NullSafetyJava {
    public  String getData(){
        return  null;
    }

}
           
kotlin代码的调用
fun main(args: Array<String>) {
    val nullSafety=NullSafetyJava()
    val data=nullSafety.data
    println(data)
//    结果:null
    val data1:String=nullSafety.data
    println(data1)
//    此时限定了data必须是String类型,不能为null,此处就会报错
}
           

Java代码
import com.sun.istack.internal.NotNull;

import java.text.SimpleDateFormat;
import java.util.Date;

public abstract class NullSafetyAbsClass {
    public abstract String formate(Date date);

    public @NotNull String formatTime(@NotNull Date date) {//注解表示传入的date参数一定不能为null
        return new SimpleDateFormat("HH:mm:dd").format(date);
    }
}
           
kotlin代码
import java.util.*

class NullSafetySubClass : NullSafetyAbsClass() {
    override fun formate(date: Date?): String {
        return date.toString()
    }
}

fun main(args: Array<String>) {
    val nullSafetySubClass = NullSafetySubClass()
    println(nullSafetySubClass.formate(Date()))
    println(nullSafetySubClass.formatTime(Date()))
    /**
     * 结果:
     * Thu Dec 07 12:03:31 GMT+08:00 2017
       12:03:07
     */

}
           

java代码
import java.util.ArrayList;
import java.util.List;

public class Generics {
    //    安卓中的MVP的绑定,kotlin中写不出这样的代码
    public abstract class View<P extends Presenter> {
        P presenter;

    }

    public abstract class Presenter<V extends View> {
        V view;
    }

    public static void main(String[] args) {
        List list = new ArrayList();//这里可以不用传泛型
        list.add("Java");
        list.add(12);
        for (Object o : list) {
            System.out.println(o);
        }
    }
//    结果:
//           Java
//           12
}
           
fun main(args: Array<String>) {
    val list=ArrayList<Any>()//此处泛型不能为空,any表示Object
    list.add("Java")
    list.add(34)
    list.map (::println)
    /**
     * 结果:
     * Java
       34
     */
}

           

import java.util.ArrayList;

public class SAMInJava {
    private ArrayList<Runnable> runnables=new ArrayList<>();
    public void addTask(Runnable runnable){
        runnables.add(runnable);
        System.out.println("After add: "+runnable+" we have "+runnables.size()+" in all.");
    }
    public void removeTask(Runnable runnable){
        runnables.remove(runnable);
        System.out.println("After remove: "+runnable+" only "+runnables.size()+" left.");

    }

}
           
import java.util.concurrent.Executors

fun main(args: Array<String>) {
    val worker= Executors.newCachedThreadPool()
    worker.execute {
        println("hello,线程池")
    }
    val samInJava=SAMInJava()
    val lanaba={
        println("hello")
    }
    //每次传的lanaba都会在java中被转换(conversion)成Runable接口的实例,每个地址都不一样
    samInJava.addTask(lanaba)
    samInJava.addTask(lanaba)
    samInJava.addTask(lanaba)
    samInJava.addTask(lanaba)
    samInJava.addTask(lanaba)

    samInJava.removeTask(lanaba)
    samInJava.removeTask(lanaba)
    samInJava.removeTask(lanaba)
    samInJava.removeTask(lanaba)
    samInJava.removeTask(lanaba)
    /**
     * 结果,并没有移除
     */
//    After add: SAMConversionKt$sam$Runnable$28f07624@548a9f61 we have 1 in all.
//    After add: SAMConversionKt$sam$Runnable$28f07624@1753acfe we have 2 in all.
//    After add: SAMConversionKt$sam$Runnable$28f07624@7c16905e we have 3 in all.
//    After add: SAMConversionKt$sam$Runnable$28f07624@2a2d45ba we have 4 in all.
//    After add: SAMConversionKt$sam$Runnable$28f07624@2a5ca609 we have 5 in all.
//    After remove: SAMConversionKt$sam$Runnable$28f07624@20e2cbe0 only 5 left.
//    After remove: SAMConversionKt$sam$Runnable$28f07624@68be2bc2 only 5 left.
//    After remove: SAMConversionKt$sam$Runnable$28f07624@28feb3fa only 5 left.
//    After remove: SAMConversionKt$sam$Runnable$28f07624@675d3402 only 5 left.
//    After remove: SAMConversionKt$sam$Runnable$28f07624@51565ec2 only 5 left.
}           

继续阅读