Android面试题

Android面试题之Kotlin和Java之间互操作

2024-05-11  本文已影响0人  AntDream

互操作性和可空性

public class JavaTest {
    public String generateName() {
        return "name";
    }

    //可以用注解标注可空
    @Nullable
    public String generateNullString() {
        return null;
    }
}



fun main() {
    val result = JavaTest()
    //要用安全操作符来操作
    println(result?.generateName())
}

类型映射

属性访问

fun main() {
    val result = JavaTest()
    println(result.generateNullString())
    //对应的Java类中属性要实现get和set方法
    println(result.points)
}

@JvmName

//System.out.printf(HeroKt.sayHello());
//用JvmName改了名字后
System.out.printf(Hero.sayHello());

@JvmField

用@JvmField修饰后,Java中可以直接调用属性,不用getter方法

class SpellBook {
    @JvmField
    val spells = "hello world"
}

public class JHaa {
    public static void main(String[] args) {
        SpellBook spellBook = new SpellBook();
        //没有@JvmField修饰时的调用方法
//        spellBook.getSpells();
        System.out.printf(spellBook.spells);
    }
}

@JvmOverloads

class SpellBook {
    @JvmField
    val spells = "hello world"

    @JvmOverloads
    fun handleWithDefault(left:String = "left", right:String = "right"){
        println("you handle with $left and $right")
    }
}

public class JHaa {
    public static void main(String[] args) {
        SpellBook spellBook = new SpellBook();
//        spellBook.getSpells();
        System.out.printf(spellBook.spells);
        //没有JvmOverloads注解时会报错,因为没有这个无参的重载函数版本
        spellBook.handleWithDefault();
    }
}

@JvmStatic

//互操作
class SpellBook {
    @JvmField
    val spells = "hello world"

    @JvmOverloads
    fun handleWithDefault(left:String = "left", right:String = "right"){
        println("you handle with $left and $right")
    }

    companion object{
        @JvmField
        val MAX_SPELL_COUNT = 10
        @JvmStatic
        fun getSpell() = println("i am groot!")
    }
}

public class JHaa {
    public static void main(String[] args) {
        SpellBook spellBook = new SpellBook();
        //伴生对象属性的调用方式
//        spellBook.Companion.getMAX_SPELL_COUNT();
        //伴生对象的属性加了@JvmField修饰以后
        int result = spellBook.MAX_SPELL_COUNT;

        spellBook.Companion.getSpell();
        //加了@JvmStatic修饰以后
        spellBook.getSpell();
    }
}

@Throws

class SpellBook {

    @Throws(IOException::class)
    fun funWithException() {
        throw IOException()
    }
}

public class JHaa {
    public static void main(String[] args) {
        SpellBook spellBook = new SpellBook();

        try {
            spellBook.funWithException();
            //没有Throws时,这里只能是Throwable,编译器也不会提示
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

函数类型操作

class SpellBook {
 
    val translator = { origin:String ->
        println(origin.lowercase().capitalize())
    }
}

public class JHaa {
    public static void main(String[] args) {
        SpellBook spellBook = new SpellBook();

        Function1<String, Unit> translator = spellBook.getTranslator();
        translator.invoke("TRACE");
}
上一篇 下一篇

猜你喜欢

热点阅读