Kotlin编程实践-【Java如何调用Kotlin中带默认值参数的函数】

问题

如果你有一个带有默认参数值的 Kotlin 函数,如何从 Java 调用它而无须为每个参数显式指定值?

方案

为函数添加注解@JvmOverloads。

也就是为Java添加重载方法,这样Java调用Kotlin的方法时就不用传递全部的参数了。

示例

在 Kotlin 中定义一个函数,函数指定了多个带默认值的参数,如下:

/*** kotlin中模拟定义一个addUser函数** 参数 name 必需的,age 和 address有默认值, 其中address可空*/
fun addUser(name: String,age: Int = 18,address: String? = null,
) {println("新增User, 信息如下:")println("name is $name, age is $age, address is $address")println("==================================")
}

在 Kotlin 中如果调用这个函数,可以指定一个、两个、三个参数来调用它,如下:

fun main() {// name必传, age 和 address 使用默认值addUser("张三")// address使用默认值addUser("李四", age = 20)// age使用默认值, address可空所以这里可以传递nulladdUser("王五", address = null)// 都不使用默认值addUser("赵六", 30, "北京")
}

执行结果如下:

新增User, 信息如下:
name is 张三, age is 18, address is null
==================================
新增User, 信息如下:
name is 李四, age is 20, address is null
==================================
新增User, 信息如下:
name is 王五, age is 18, address is null
==================================
新增User, 信息如下:
name is 赵六, age is 30, address is 北京
==================================

然而,Java方法不支持默认参数,所以当在Java中调用这个函数时,必须提供所有的参数,如下:

public static void main(String[] args) {// 缺少任何一个参数就会报错// KotlinDemoKt.addUser("java", 100);// 必须传递三个参数KotlinDemoKt.addUser("java", 100, null);
}

打印结果如下:

新增User, 信息如下:
name is java, age is 100, address is null
==================================

在这里插入图片描述
从截图中也可以看出,Java调用的时候,addUser方法需要传递三个参数才行。

如果将注解 @JvmOverloads 添加到函数中,生成的类将支持所有的函数重载。改造如下:
在这里插入图片描述
给 Kotlin 中定义的函数加上注解 @JvmOverloads ,此时再回到 Java 中调用发现:
在这里插入图片描述
此时 Java 中调用 Kotlin 的函数 addUser,就有了三个方法可调用了,这就是注解 @JvmOverloads 的作用,让它看起来就像是 Java 中的重载方法。

同样可以对 Kotlin 中的构造函数做出这样的操作,如下,在 Person 类中生成三个构造方法:
在这里插入图片描述
Kotlin 中的类此时没有添加注解 @JvmOverloads , 所以 Java 创建类对象的时候,还是必须要传递三个参数的初始值。

加上注解之后,如下:
在这里插入图片描述
如上,Java 中实例化类可以使用不同参数完成了。

注意:Kotlin 中的主构造函数,没有注解和修饰符的时候,可以省略关键字 constructor,但因为此时有注解 @JvmOverloads,所以需要加上关键字 constructor。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

干部管理软件有哪些

随着信息技术的飞速发展,干部管理软件在各级党政机关、国企事业单位中扮演着越来越重要的角色。这些软件通过整合干部管理的各项业务流程,实现了干部信息的系统化、规范化和高效化管理。以下是几款主流的干部管理软件及其特点: 一、干部信息…

基于python深度学习的CNN图像识别鲜花-含数据集+pyqt界面

代码下载: https://download.csdn.net/download/qq_34904125/89383615 本代码是基于python pytorch环境安装的。 下载本代码后,有个requirement.txt文本,里面介绍了如何安装环境,环境需要自行配置。 或可直接参考下面博文进行…

AI 一键换脸,背景替换,ioDraw让图片更有趣

还在为繁琐的图片处理而烦恼吗?快来试试ioDraw的AI图片工具! 它集图像识别、图像生成、智能换脸、背景替换、图像融合、肖像风格化、空间风格化、智能扩图、智能抠图、画质提升、美颜、拉伸修复、透视校正等功能于一身,为你提供前所未有的图…

(Javascript)AI数字人mp4转canvas播放并去除背景绿幕

1、需求介绍 H5页面嵌入AI数字人播报&#xff0c;但生成的数字人是mp4格式且有绿幕背景&#xff0c;需要转成canvas并去除背景&#xff1b; 2、效果&#xff1a; 去除前&#xff1a; 去除后&#xff1a; 3、代码 <!DOCTYPE html> <html lang"en"><…

【第9章】Vue之Element Plus快速入门

文章目录 前言一、安装1. 兼容性2. 安装 二、按需导入1.自动导入2.Vite 三、全局配置四、官方案例五、效果总结 前言 基于 Vue 3&#xff0c;面向设计师和开发者的组件库。 一、安装 1. 兼容性 Element Plus 目前还处于快速开发迭代中。 由于 Vue 3 不再支持 IE11&#xff0c…

Opus从入门到精通(五)OggOpus封装器全解析

Opus从入门到精通(五)OggOpus封装器全解析 为什么要封装 前面Opus从入门到精通(四)Opus解码程序实现提到如果不封装会有两个问题: 无法从文件本身获取音频的元数据(采样率,声道数,码率等)缺少帧分隔标识,无法从连续的文件流中分隔帧(尤其是vbr情况) 针对上面的问题我们可以…

北京活动会议通常会邀约哪些媒体参会报道?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 北京作为我国的首都和文化中心&#xff0c;各类活动会议资源丰富&#xff0c;吸引了众多媒体的关注。以下是一些通常会被邀约参会报道的重要媒体类型&#xff1a; 国家级新闻机构&#x…

flink standalone部署模式

standalone模式可以在单台机器以不同进程方式启动&#xff0c;也可以以多机器分布式方式启动。 任务的提交模式有三种&#xff1a;application mode、session model、per-job mode&#xff08;1.4x版本后过时&#xff09;。 注意区分任务的提交模式与集群的部署模式区别。 以…

注册中心理论学习

注册中心介绍 注册中心&#xff08;也称为服务注册中心或服务发现服务&#xff09;是微服务架构中的一个关键组件&#xff0c;它负责服务的注册与发现。在微服务体系中&#xff0c;服务实例的数量和位置是动态变化的&#xff0c;注册中心提供了一个集中的地方来存储这些信息&a…

linux中DNS域名解析服务(后续补充)

分离解析简介&#xff1a; 分离解析的域名服务器实际也是主域名服务器&#xff0c;这里主要是指根据不同的客户端提供不同的域名解析记录。比如来自内网和外网的不同网段地址的客户机请求解析同一域名时&#xff0c;为其提供不同的解析结果。 实验要求&#xff1a;防火墙要么关…

AMSR-MODIS 边界层水汽 L3 每日 1 度 x 1 度 V1、V2 版本数据集

AMSR-MODIS Boundary Layer Water Vapor L3 Daily 1 degree x 1 degree V1 (AMDBLWV) at GES DISC AMSR-MODIS Boundary Layer Water Vapor L3 Daily 1 degree x 1 degree V2 (AMDBLWV) at GES DISC 简介 该数据集可估算均匀云层下的海洋边界层水汽。AMSR-E 和 AMSR-2 的微波…

在C#中对 JSON进行序列化和反序列化处理

概述&#xff1a;在现代软件开发领域&#xff0c;不同系统和平台之间的数据交换是不可或缺的方面。JSON&#xff08;JavaScript 对象表示法&#xff09;因其轻量级、人类可读和易于解析的特性而成为一种无处不在的数据格式。使用 C# &#x1f680;编程的 JSON 序列化和反序列化…

气膜球幕影院:大众追捧的全新体验—轻空间

近年来&#xff0c;气膜球幕影院因其独特的观影体验和灵活的应用&#xff0c;受到了广大观众的热烈欢迎。轻空间带您来探讨一下气膜球幕影院为何如此受欢迎。 沉浸式体验的吸引力 气膜球幕影院的360度全景沉浸式体验&#xff0c;让观众仿佛置身于影片的世界中。这种前所未有的观…

ripro主题如何使用memcached来加速

ripro主题是个很不错的资源付费下载主题。主题自带了缓存加速开关&#xff0c;只要开启了缓存加速功能&#xff0c;正常情况下能让网站访问的速度提升很大。 但好多人这么做了却发现没啥加速效果&#xff0c;原因就在于wordpress里缺少了memcache文件。只需要把object-cache.ph…

OPNsense 24.1 - 基于 FreeBSD 的开源防火墙和路由平台

OPNsense 24.1 - 基于 FreeBSD 的开源防火墙和路由平台 请访问原文链接&#xff1a;https://sysin.org/blog/opnsense/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org 关于 OPNsense OPNsense 是一个开源、易于使用且易于构建…

Python Kivy库:跨平台应用开发

更多Python学习内容&#xff1a;ipengtao.com Kivy是一个用于开发跨平台应用的开源Python库。它支持在Windows、macOS、Linux、iOS和Android等多种平台上运行&#xff0c;并且具有强大的图形界面功能。Kivy的设计理念是简洁易用&#xff0c;能够快速创建具有现代UI的应用。本文…

linux centos 安装docker

本章教程介绍如何在Linux CentOS中安装Docker服务。 1. 更新系统软件包 首先,确保你的系统软件包是最新的: sudo yum update -y2. 安装必要的依赖包 安装一些必要的依赖包: sudo yum install -y yum-utils device-mapper-persistent-data lvm23. 添加 Docker 的官方仓库…

word中根据上级设置下级编号

如上级是3.13.4&#xff0c;如下图 现在想设置下级编码跟随上级逐级显示成3.13.4.1 则在标题功能说明这点击顶部菜单栏的编号按钮&#xff0c;如下图 然后&#xff0c;选择自定义编号-自定义列表-自定义按钮 然后重点是编号格式这一栏&#xff0c;需要手动填写下前三级的编号&…

花卉识别-python-pytorch-CNN深度学习含数据集+pyqt界面

代码下载地址&#xff1a; https://download.csdn.net/download/qq_34904125/89383063 本代码是基于python pytorch环境安装的。 下载本代码后&#xff0c;有个requirement.txt文本&#xff0c;里面介绍了如何安装环境&#xff0c;环境需要自行配置。 或可直接参考下面博文…

Java | Leetcode Java题解之第145题二叉树的后序遍历

题目&#xff1a; 题解&#xff1a; class Solution {public List<Integer> postorderTraversal(TreeNode root) {List<Integer> res new ArrayList<Integer>();if (root null) {return res;}TreeNode p1 root, p2 null;while (p1 ! null) {p2 p1.left…