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

本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点

互操作性和可空性
  • 要注意Java中所有类型都是可空的
  • String!表示平台数据类型
public class JavaTest {
            public String generateName() {
                return "name";
            }

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



        fun main() {
            val result = JavaTest()
            //要用安全操作符来操作
            println(result?.generateName())
        }
类型映射
  • kotlin代码运行时,所有的映射类型都会重新映射回对应得Java类型
属性访问
  • 不需要调用相关setter和getter方法,可以用赋值语法来设置一个Java字段值
fun main() {
    val result = JavaTest()
    println(result.generateNullString())
    //对应的Java类中属性要实现get和set方法
    println(result.points)
}

@JvmName
  • 用来注解指定编译类的名字,方便Java调用
//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
  • 协助产生kotlin函数的重载版本,设计一个可能会暴露给Java用户使用的API,记得使用 @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
  • @JvmField注解还能用来以静态方式提供伴生对象里定义的值
  • @JvmStatic注解的作用类似于@JvmField,允许你直接调用伴生对象的函数

    //互操作
        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
  • 抛出一个需要检查的指定异常,Java和kotlin有关的异常检查的差异让@Throws注解解决了,在编写供Java开发者调用的Kotlin API时,要考虑使用@Throws注解。这样用户就指定怎么正确处理任何异常了
  • kotlin中抛出的异常会被转换成Throwable,Java中会catch不了。加上@Throws注解就可以在Java中正常catch
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();
                }
            }
        }
函数类型操作
  • kotlin函数类型和匿名函数的简洁高效的语法因->操作符而实现,但Java8之前的JDK版本不支持lambda表达式。
  • 在Java里,kotlin函数类型使用FuctionN这样的名字的接口来表示,N代表值参的数目,这样的Function接口由23个,每一个都包含一个invoke函数,专门用于调用函数类型函数
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");
    }

欢迎关注我的公众号查看更多精彩文章!

AntDream

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android Studio 是一款开发Android应用程序的集成开发环境(IDE),它支持多种编程语言,包括KotlinJavaKotlin是一种现代的、静态类型的编程语言,可以与Java无缝操作。在Android开发中,选择使用KotlinJava取决于个人偏好和项目要求。如果你在Android Studio中使用了Kotlin进行开发,后续需要将其转换为Java,可以按照以下步骤进行操作: 首先,确保你的Android Studio已经安装了Kotlin插件。如果没有安装,可以通过打开Android Studio的设置,在插件选项卡中搜索并安装Kotlin插件。 接下来,打开你的Kotlin文件,并在顶部选择“Code” -> “Convert Java File”,Android Studio将会自动生成相应的Java代码。 在自动生成的Java代码中,你可能需要手动进行一些修改和调整,以确保代码的正确性和可读性。 在进行转换之前,建议先备份你的Kotlin代码,以防止意外情况发生。 需要注意的是,KotlinJava在某些方面有些语法和特性上的差异,尤其是Kotlin的一些特性可能在Java中无法直接实现。因此,在进行转换时需要进行一些额外的工作来适应Java的语法和约束。 总结来说,将Android Studio中的Kotlin代码转换为Java可以通过使用Kotlin插件自动生成Java代码,并在此基础上进行一些手动的修改来实现。转换的过程需要仔细检查和验证,以确保转换后的Java代码的正确性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值