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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/619735.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

瞬息全宇宙——平行宇宙终极教程,手把手教你做出百万点赞视频

最近一种叫“瞬息全宇宙”的视频火了&#xff0c;抖音一期视频百万赞&#xff0c;各个博主视频都在带瞬息全宇宙这个标签&#xff0c;于是就有很多朋友催我出教程了&#xff0c;在琢磨了几天之后&#xff0c;终于整出来了 教程包含了插件的安装&#xff0c;界面的讲解&#xff…

for 双重循环

一.双循环&#xff1a; 可以使用嵌套循环来实现脚本的双层循环&#xff0c;示例代码如下 1.显示外循环是$a 内循环$b encho -e \t 是制表符 2.9 9乘法表 for 循环&#xff1a; echo -n是不换行输出 while循环: 3.输出长度宽度都为9个星的矩形 for循环 while循环 …

开发者出海时都在用哪些组件库?

❝ 哈喽&#x1f44b;&#xff0c;我是树酱。今天我要介绍的是在开发者出海时经常使用的组件库。这些组件库大多采用Tailwind CSS作为基础&#xff0c;它们不仅风格独树一帜&#xff0c;而且外观也非常吸引人&#xff01; 1.Shadcn-ui shadcn的风格跟Notion风格很像&#xff0c…

博客互动革命:如何打造活跃读者社区并提升参与度

CSDN 的朋友你们好&#xff0c;我是未来&#xff0c;今天给大家带来专栏【程序员博主教程&#xff08;完全指南&#xff09;】的第 10 篇文章“与读者互动”。本文揭示了提升技术博客参与度的秘诀。从评论互动到社交媒体策略&#xff0c;本文将指导你如何建立强大的读者社区。掌…

编程技巧:什么是JavaScript递归

什么是递归 程序调用自身的编程技巧称为递归&#xff08;recursion&#xff09; 递归的基本思想是将一个复杂的问题分解成更小、更易于管理的子问题&#xff0c;这些子问题与原始问题相似&#xff0c;但规模更小。 递归的要素 基本情况&#xff08;Base Case&#xff09;&…

【C语言 | 数据结构】栈

文章目录 前言1、栈1.1栈的概念和定义1.1.2栈的基本概念&#xff1a; 1.2栈的方法(接口)1.3栈的实现方法1.4栈的性质1.5栈的应用1.6栈的结构 2、栈的实现2.1 顺序栈2.1.1 顺序栈的结构体2.1.2 顺序栈的初始化2.1.3 顺序栈的销毁2.1.4 顺序栈的入栈2.1.5 顺序栈的出栈2.1.5 顺序…

聚观早报 | 比亚迪海狮07 EV上市;苹果将升级Siri

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 5月13日消息 比亚迪海狮07 EV上市 苹果将升级Siri OpenAI开发全新技术 沃尔沃EX30车型将上市 SpaceX计划新建发…

template——模板进阶(C++)

在之前的文章中&#xff0c;介绍了模板初阶&#xff1a;Cpp_桀桀桀桀桀桀的博客-CSDN博客 在本篇中将会对模板进一步的讲解。本篇中的主要内容为&#xff1a;非类型模板参数、函数模板的特化、类模板的特化&#xff08;其中包含全特化和偏特化&#xff09;&#xff0c;最后讲解…

【计算机网络篇】数据链路层(9)使用集线器的共享式以太网

文章目录 &#x1f6f8;使用同轴电缆的共享总线以太网 &#x1f386;使用集线器的共享式以太网&#x1f95a;集线器的特点 &#x1f354;10BASE-T星型以太网 &#x1f6f8;使用同轴电缆的共享总线以太网 若总线上的某个机械连接点接触不良或断开&#xff0c;则整个网络通信就不…

【前端工程化指南】Git常见操作之忽略文件

默认情况下&#xff0c;Git管理代码版本时会对所有文件进行跟踪&#xff0c;但有些时候我们并不希望项目中的一些文件上传到远程仓库或公共仓库中&#xff0c;例如密钥&#xff0c;个人隐私文件等。因此Git提供了两种忽略跟踪文件的方式.gitignore文本文件与git rm命令&#xf…

亿级流量下通用的高并发架构设计

既然是亿级用户应用&#xff0c;那么高并发必然是其架构设计的核心要素。 本文我们将介绍高并发架构设计的一些通用设计方案。 关键词&#xff1a;读/写分离、数据缓存、缓存更新、CQRS、数据分片、异步写 本文节选自电子工业出版社博文视点刚刚出版的《亿级流量系统架构设计…

Java随笔1

1.编程中组件的概念&#xff1a; 在编程中&#xff0c;组件&#xff08;Component&#xff09;通常指的是一种可重用的、模块化的代码单元&#xff0c;它封装了特定的功能或用户界面元素&#xff0c;并提供了与其他代码进行交互的接口。组件可以看作是对数据和方法的简单封装&…

ADS基础操作篇2

上篇文章《ADS基础介绍篇1》,对ADS界面,常用小工具及自带设计模板进行了介绍。ADS使用非常方便,含大量的控件和仿真模板。这篇文章我们主要讲解ADS的基础操作,包含Workspace、原理图、symbol的创建,仿真结果查看及优化。 1. 新建Workspace 添加名称及路径后,点击create…

共享充电宝语音芯片ic方案支持远程4g无线更新语音

一、简介 共享充电宝语音芯片ic方案支持远程4g无线wifi蓝牙更新语音 共享充电宝已经是遍布在大街小巷的好产品&#xff0c;解决了携带充电宝麻烦的痛点 但是很多的共享充电宝在人机交互方便&#xff0c;还做得不够好&#xff0c;比如&#xff1a;借、还设备没有语音提示&…

基于SSM的计算机课程实验管理系统的设计与实现(源码)

| 博主介绍&#xff1a;✌程序员徐师兄、8年大厂程序员经历。全网粉丝15w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f44…

AI视频教程下载:用ChatGPT制作 YouTube视频的指南

课程大纲&#xff1a; 面向 YouTuber 的 ChatGPT YouTube关键词研究 YouTube标题 YouTube缩略图 YouTube社区帖子 组织您的 YouTube 视频 本课程将通过两个不同领域的YouTube视频&#xff0c;展示如何使用Chat GPT来创建关键词、标题、缩略图、描述和社区帖子。 关键词研…

【Linux网络】Https【下】{CA认证/证书的签发与认证/安全性/总结}

文章目录 1.引入证书【为方案五铺垫】1.1再谈https1.2SSL/TLS1.3CA机构1.4理解数字签名1.4继续铺垫1.5方案五服务端申请证书回顾一二三回顾方案四方案五过程寻找方案五的漏洞客⼾端对证书进⾏认证 2.查看证书2.1查看浏览器的受信任证书发布机构2.2中间⼈有没有可能篡改该证书2.…

Postman工具介绍与安装

一、Postman介绍 Postman 乃是一款对 HTTP 协议予以支持的接口调试及测试工具&#xff0c;其突出特性在于功能强大&#xff0c;并且使用简便、易用性良好。不管是开发人员开展接口调试工作&#xff0c;还是测试人员进行接口测试任务&#xff0c;Postman 均属于首选工具之一。 接…

会声会影2024中文旗舰免费版(Corel VideoStudio)下载安装包附带会声会影软件注册机

一、软件背景及版本概述 会声会影&#xff08;Corel VideoStudio&#xff09;是由加拿大Corel公司发布的一款视频编辑软件&#xff0c;该软件以其功能丰富、操作简便而广受好评。2024年版本在继承之前版本优点的基础上&#xff0c;进行了诸多创新和改进&#xff0c;为用户提供…

2万字干货:如何从0到1搭建一套会员体系(4)

开始本节前还是一样来个灵魂发问&#xff1a;为什么产品需要用户标签&#xff0c;或者用户标签有什么意义/价值&#xff1f; 某些业务场景下使用会员等级无法满足业务需要。比如新用户激活、老用户福利以及沉默客户唤醒等等。 用户等级划分的逻辑和维度有些局限性&#xff0c;…