当前位置: 首页 > news >正文

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

  • 点击跳转=>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.lryc.cn/news/227772.html

相关文章:

  • Python与ArcGIS系列(三)视图缩放
  • [ASP]数据库编辑与管理V1.0
  • MyBatis Plus整合Redis实现分布式二级缓存
  • 如何帮助 3D CAD 设计师实现远程办公
  • 如何在 Idea 中修改文件的字符集(如:UTF-8)
  • 【C++】单例模式【两种实现方式】
  • php的api接口token简单实现
  • CCNA课程实验-13-PPPoE
  • cocosCreator 之 Bundle使用
  • 分类网络搭建示例
  • 为 Ubuntu 虚拟机构建 SSH 服务器
  • SpringBoot--中间件技术-2:整合redis,redis实战小案例,springboot cache,cache简化redis的实现,含代码
  • linux rsyslog配置文件详解
  • wordpress是什么?快速搭网站经验分享
  • 排序 算法(第4版)
  • asp.net 在线音乐网站系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio
  • ElastaticSearch -- es之Filters aggregation 先过滤再聚合
  • 如何把一个接口设计好?
  • mini-vue 的设计
  • React整理杂记(一)
  • [100天算法】-统计封闭岛屿的数目(day 74)
  • esp32-rust-std-examples-blinky
  • 【docker容器技术与K8s】
  • RT-DTER 引入用于低分辨率图像和小物体的新 CNN 模块 SPD-Conv
  • Folw + Room 实现自动观察数据库的刷新
  • 黑马程序员微服务Docker实用篇
  • 虚拟化服务器+华为防火墙+kiwi_syslog访问留痕
  • FlinkSQL聚合函数(Aggregate Function)详解
  • TensorFlow学习笔记--(3)张量的常用运算函数
  • RT-Thread:嵌入式实时操作系统的设计与应用