Android修行手册 - 可变参数中星号什么作用(冷知识)

news2024/12/23 8:26:58
  • 点击跳转=>Unity3D特效百例
  • 点击跳转=>案例项目实战源码
  • 点击跳转=>游戏脚本-辅助自动化
  • 点击跳转=>Android控件全解手册
  • 点击跳转=>Scratch编程案例
  • 点击跳转=>软考全系列

👉关于作者

专注于Android/Unity和各种游戏开发技巧,以及各种资源分享(网站、工具、素材、源码、游戏等)
有什么需要欢迎底部卡片私我,交流让学习不再孤单

在这里插入图片描述

👉实践过程

😜问题

这两天,我想封装一个方法:

private fun strFormatTwo(format: String, vararg args: Any): String {
    return String.format(format, args)
}

传递两个参数,一个是转换格式,一个是可变参数。
调用:strFormatTwo(“%04x”,20,30)
一运行就会报错。
java.util.IllegalFormatConversionException: x != [Ljava.lang.Object;
这就很莫名其妙,但是为什么系统的 String.format 就可以这样操作呢?
我点击去看源码:
在这里插入图片描述
发现它有个星号(*),开始查阅资料。

😜解决

查了一下。星号的作用是,在数组对象前加*号可以将数组展开,以方便传值。
展开?这有什么可展开的?难道传递的少了?
咱们写个方法测试一些:

private fun strFormat(format: String, vararg args: Any): String {
    Log.e("TAG", "strFormat: "+args.size)
    return String.format(format, args)
}

private fun strFormatTwo(format: String, vararg args: Any): String {
    Log.e("TAG", "strFormatTwo: "+args.size)
    return strFormat(format, args)
//    return String.format(format, args)
}

//调用
strFormatTwo("%04x",20,30)

在这里插入图片描述
上面方法因为系统的 String.format 里面没法打日志,我们只好再写一个方法,这样调用一下。
strFormatTwo 调用系统 String.format 和 strFormatTwo 调用咱们写的 strFormat 方法形式是一样。

我们先调用 strFormatTwo 看到日志输出的是 2 个长度单位,在 strFormat 中输出却成为了一个长度。

private fun strFormat(format: String, vararg args: Any): String {
    return String.format(format, *args)  //带星号正确写法
}

这是因为 Java 中的 vararg 参数在被传递给 String.format() 方法时,会自动被转换为一个数组。这表示我们将 args 数组作为参数传递给 String.format() 方法。这样做是为了确保 args 数组能够以参数的形式传递给 String.format() 方法,以便正确地进行格式化字符串。 而在出现问题的函数中,我们使用了 “String.format(format, args)” 的写法,这表示我们将 args 作为一个单个的参数传递给 String.format() 方法。这样做会导致 args 数组无法正确传递给 String.format() 方法,从而导致错误。 因此,为了确保 args 数组能够以参数的形式传递给 String.format() 方法,我们应该使用第一个函数的实现方式,即使用 “String.format(format, *args)” 的写法。

同理,如果你自己的其他函数参数也是可变数组的,而传递的也是数组,使用的时候就需要添加*

👉其他

📢作者:小空和小芝中的小空
📢转载说明-务必注明来源:https://zhima.blog.csdn.net/
📢这位道友请留步☁️,我观你气度不凡,谈吐间隐隐有王者霸气💚,日后定有一番大作为📝!!!旁边有点赞👍收藏🌟今日传你,点了吧,未来你成功☀️,我分文不取,若不成功⚡️,也好回来找我。

温馨提示点击下方卡片获取更多意想不到的资源。
空名先生

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

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

相关文章

No183.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

【MySQL系列】 第一章 · MySQL概述

写在前面 Hello大家好, 我是【麟-小白】,一位软件工程专业的学生,喜好计算机知识。希望大家能够一起学习进步呀!本人是一名在读大学生,专业水平有限,如发现错误或不足之处,请多多指正&#xff0…

Visual Studio 2019 写 Unity 脚本时,烦人又离谱的自动补全!

Visual Studio 2019 写 Unity 脚本时,逆天又离谱的自动补全! 血压高升的原因 写脚本的时候,智能提示有哪些函数可以使用,是非常棒的一件事情,有助于游戏开发者编写和检查自己的脚本代码。 但是! 我想输入…

Leetcode—2469.温度转换【简单】

2023每日刷题(二十六) Leetcode—2469.温度转换 实现代码 /*** Note: The returned array must be malloced, assume caller calls free().*/ double* convertTemperature(double celsius, int* returnSize) {double* ans (double *)malloc(sizeof(do…

Leetcode—107.二叉树的层序遍历II【中等】

2023每日刷题(二十七) Leetcode—107.二叉树的层序遍历II 实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullpt…

Radius是什么意思? 安当加密

Radius是什么意思? RADIUS(Remote Authentication Dial In User Service)是一种远程用户拨号认证系统,它由RFC 2865和RFC 2866定义,是应用最广泛的AAA(Authentication、Authorization、Accounting&#xf…

【编程语言发展史】Python的起源和发展历史

目录 Python的起源 Python的发展历史 Python的生态系统和应用领域 Python的社区和发展模式 Python的未来趋势和挑战 Python是一门广受欢迎的高级编程语言,其起源和发展历史自20世纪末至今,经历了多个版本的迭代和社区的广泛参与。以下是关于Python的…

C 语言函数

C 语言函数 在本教程中,将向您介绍C语言编程中的函数(用户定义函数和标准库函数)。此外,您还将学习为什么在编程中使用函数。 函数是执行特定任务的代码块。 假设您需要创建程序来创建一个圆并为其着色。您可以创建两个函数来解…

goroutine调度模型 调度策略

文章目录 背景 协程线程与协程的对比线程(Thread)协程(Coroutine) 运作线程模型 goroutine调度模型与演进过程G-M模型G-P-M模型抢占式调度器其他优化 调度策略队列轮转系统调用工作量窃取抢占式调度GOMAXPROCS 对性能的影响 Go在语…

459. 重复的子字符串

459. 重复的子字符串 原题链接:完成情况:解题思路:参考代码:__459重复的子字符串_枚举__459重复的子字符串_字符串匹配__459重复的子字符串_KMP算法__459重复的子字符串_优化的KMP算法 错误经验吸取 原题链接: 459. …

C 用户定义函数

C 用户定义函数 在本教程中,您将借助示例学习在C语言编程中创建用户定义的函数。 函数是执行特定任务的代码块。 C允许您根据需要定义函数。这些函数称为用户定义函数。例如: 假设您需要创建一个圆并根据半径和颜色为其着色。您可以创建两个函数来解…

No182.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

C语言数据结构-----双向链表增删查改的代码实现

文章目录 1.初始化双链表2.创建链表节点3.打印链表4.尾插5.尾删6.头插7.头删8.在pos之前插入8.1 在pos之前插入(改造头插)8.2 在pos之前插入(改造尾插) 9.删除pos位置9.1 删除pos位置(改造尾删)9.1 删除pos位置(改造头删) 10.查找11.毁灭 链接: 顺序表(动态顺序表增删查改的代码…

基于SSM的微博网站的设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…

Python基础入门例程54-NP54 被5整除的数字(循环语句)

最近的博文: Python基础入门例程53-NP53 前10个偶数(循环语句)-CSDN博客 Python基础入门例程52-NP52 累加数与平均值(循环语句)-CSDN博客 Python基础入门例程51-NP51 列表的最大与最小(循环语句)-CSDN博客 目录 最近的博文: 描述 输入描述&#xf…

Redis 5大数据类型命令解读

目录 Redis key的命令 Redis 10大数据类型 1、redis字符串(String) 2、redis列表(List) 3、redis哈希表(Hash) 4、redis集合(Set) 5、redis有序集合(ZSet) Redis 命令网站:redis中文文档 Redis key的命令 命令说明示例keys *查看当…

人工智能基础——图像认知与OpenCV

人工智能的学习之路非常漫长,不少人因为学习路线不对或者学习内容不够专业而举步难行。不过别担心,我为大家整理了一份600多G的学习资源,基本上涵盖了人工智能学习的所有内容。点击下方链接,0元进群领取学习资源,让你的学习之路更加顺畅!记得…

【Python基础】try-finally语句和with语句

📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨ 📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 📢:文章若有幸对你有帮助,可点赞 👍…

灰度与二值化

人工智能的学习之路非常漫长,不少人因为学习路线不对或者学习内容不够专业而举步难行。不过别担心,我为大家整理了一份600多G的学习资源,基本上涵盖了人工智能学习的所有内容。点击下方链接,0元进群领取学习资源,让你的学习之路更加顺畅!记得…

No180.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…