Android项目中多vararg参数编译报错问题求助
解决Kotlin中多个vararg参数的编译错误
这个问题我之前也碰到过,Kotlin确实不允许一个函数里定义多个vararg参数——因为vararg本质是让调用者可以传递任意数量的参数,编译器会自动把它们打包成数组,多个vararg会导致参数解析的歧义,所以直接这么写肯定会报错。下面给你几个实用的解决方案:
方法一:将其中一个vararg替换为List参数
保留一个vararg用于快速传递参数,另一个换成List类型,这样既兼顾调用的便利性,又符合语法规则。比如我们把errorResponsePair改成List<Pair<Int, String>>:
fun createTransportResponse( response: Response<*>, vararg throwables: Throwable, errorResponsePairs: List<Pair<Int, String>> ): TransportResponse { val transportResponse = TransportResponse() // 处理可变参数throwables,直接遍历即可 throwables.forEach { throwable -> // 这里添加你的异常处理逻辑 } // 处理错误响应对列表 errorResponsePairs.forEach { (code, message) -> // 这里添加错误码和消息的处理逻辑 } return transportResponse }
调用的时候,可变参数可以直接传多个值,列表用listOf包装:
createTransportResponse( myResponse, Throwable("网络异常"), Throwable("超时错误"), errorResponsePairs = listOf(400 to "请求参数错误", 500 to "服务器内部错误") )
如果想让vararg的调用更自然,建议把它放在参数列表的最后,调整一下顺序:
fun createTransportResponse( response: Response<*>, errorResponsePairs: List<Pair<Int, String>>, vararg throwables: Throwable ): TransportResponse { // 逻辑同上 }
这样调用时就不需要给throwables加命名参数了:
createTransportResponse( myResponse, listOf(400 to "请求参数错误"), Throwable("网络异常"), Throwable("超时错误") )
方法二:两个参数都换成List类型
如果不需要特别依赖vararg的便捷性,直接把两个可变参数都换成List,函数定义会更统一:
fun createTransportResponse( response: Response<*>, throwables: List<Throwable>, errorResponsePairs: List<Pair<Int, String>> ): TransportResponse { val transportResponse = TransportResponse() // 处理逻辑同上 return transportResponse }
调用时用listOf传递两组参数即可:
createTransportResponse( myResponse, listOf(Throwable("网络异常"), Throwable("超时错误")), listOf(400 to "请求参数错误", 500 to "服务器内部错误") )
方法三:包装参数为自定义数据类(可选)
如果你的错误响应对有特定的业务含义,可以把它包装成一个数据类,让函数语义更清晰,不过这种方式不如直接用List简洁:
// 定义数据类包装错误响应对 data class ErrorResponseList(val pairs: List<Pair<Int, String>>) fun createTransportResponse( response: Response<*>, vararg throwables: Throwable, errorResponses: ErrorResponseList ): TransportResponse { val transportResponse = TransportResponse() // 处理错误响应对:errorResponses.pairs return transportResponse }
调用时:
createTransportResponse( myResponse, Throwable("网络异常"), errorResponses = ErrorResponseList(listOf(400 to "请求参数错误")) )
总的来说,前两种方法是最常用的,尤其是方法一,能平衡代码的简洁性和调用的便利性,完全可以解决你的编译问题。
内容的提问来源于stack exchange,提问作者Alexei
相关产品推荐
相关产品推荐

