Kotlin中变量声明时带括号的写法是什么语法
语法归属
你代码中包裹变量名的括号属于Kotlin的解构声明语法。
具体规则与作用
- 解构声明的核心逻辑是:编译器会根据括号内变量的位置,自动调用赋值源对象对应的
componentN()运算符方法(N从1开始计数,和变量位置一一对应),将方法返回值赋值给对应位置的变量,省去手动调用对象属性取值的代码。 - 解构声明最常用的场景是同时拆解对象的多个属性,比如遍历Map、获取数据类的多个字段:
data class FileAndMediaItem(val name: String, val path: String, val size: Long) val item = FileAndMediaItem("测试.jpg", "/sdcard/1.jpg", 1024L) // 多变量解构,一次性拿到文件名和路径 val (fileName, filePath) = item // 上述代码等价于 // val fileName = item.component1() // val filePath = item.component2() - 你代码里单变量包裹括号的写法属于解构声明的特殊情况:
- 代码执行逻辑等价于
val valName = (list[fileAndMediaHolder.adapterPosition] as FileAndMediaItem).component1() - 该写法能正常编译的前提是
FileAndMediaItem类存在符合规则的component1()方法:如果是数据类,Kotlin会自动按主构造参数顺序生成对应componentN()方法,第一个主构造参数对应component1();如果是普通类,需要手动声明operator fun component1(): 对应返回类型的方法,否则会直接编译报错。 - 这种单变量加括号的写法完全是冗余的,和直接去掉括号写
val valName = list[fileAndMediaHolder.adapterPosition] as FileAndMediaItem相比没有任何额外作用,反而会增加无意义的方法调用(虽然多数场景下会被编译器优化移除),也会提高其他开发者的理解成本,日常开发不推荐这么写。
- 代码执行逻辑等价于
内容的提问来源于stack exchange,提问作者Vladimir Fisher
相关产品推荐
相关产品推荐

