Kotlin解构声明报错Any类型无component1()函数,如何获取Triple第三元素
报错原因
getLatency方法声明的返回值类型是Any,而解构语法依赖数据类的componentN()系列方法,Any类型不存在这些方法,因此无法直接解构。你实际返回的Triple本身是Kotlin标准库提供的数据类,本身支持解构和first/second/third属性访问,只需要修正类型声明或者做强转即可。
解决方法
方案1(推荐):修改getLatency返回值类型
直接将方法的返回值类型从Any调整为实际返回的Triple<Int, Int, Int>,修改后代码如下:
open class LatencyReader { companion object { // 仅修改此处的返回值类型即可 fun getLatency(conn: Connection, locationAssignment: HashMap<String, String>): Triple<Int, Int, Int> { return Triple(LatencyReader.MissingLatency, LatencyReader.MissingLatency, LatencyReader.MissingLatency) } val MissingLatency: Int = 9999 } }
修改完成后你原来的解构写法可以直接正常运行,也可以直接访问Triple的第三个属性:
for(conn in connection) { // 解构写法正常可用 var(first,second,third) = reader.getLatency(conn,LocationAssignment) // 或者直接拿第三个元素 val thirdVal = reader.getLatency(conn,LocationAssignment).third }
方案2:无法修改源码时做强转
如果你没有权限修改LatencyReader的源码,可以将返回的Any对象强转为Triple后再访问属性:
for(conn in connection) { val res = reader.getLatency(conn,LocationAssignment) as Triple<*, *, *> // 访问第三个元素 val third = res.third // 也可以正常解构 val (first, second, third) = res }
如果担心类型不匹配抛出异常,可以使用安全强转:
for(conn in connection) { val res = reader.getLatency(conn,LocationAssignment) as? Triple<*, *, *> ?: continue val third = res.third }
内容的提问来源于stack exchange,提问作者CodeThisAndThat
相关产品推荐
相关产品推荐

