Kotlin函数如何返回含自定义data class的多类型多值及方案详解
问题解决实现
你需要返回5个不同类型的值,包括自定义的DMSAngle,优先选择自定义数据类作为返回值的方案,不存在自定义类无法返回的问题:
首先定义返回结果的数据类:
// 可以直接定义在文件顶层,也可以定义在函数内部作用域 data class CoordinateInverseResult( val horizontalDistance: Double, val heightDifference: Double, val slopePercent: Double, val slopeDistance: Double, val g12DMS: DMSAngle )
然后修改你的函数,返回该数据类实例:
fun coordinateInverseCalculation(point1: Point3D, point2: Point3D): CoordinateInverseResult { val horizontalDistance = sqrt( (point2.easting - point1.easting).pow(2.0) + (point2.northing - point1.northing).pow(2.0) ) val heightDifference = point2.height - point1.height val slopePercent = (heightDifference / horizontalDistance) * 100 val slopeDistance = sqrt( (point2.easting - point1.easting).pow(2.0) + (point2.northing - point1.northing).pow(2.0) + (point2.height - point1.height).pow(2.0) ) val point12D = Point(easting = point1.easting, northing = point1.northing) val point22D = Point(easting = point2.easting, northing = point2.northing) val g12 = gizement(point12D, point22D) val g12DMS = decimalDegreesToDMS(g12) // 直接返回构造的结果实例 return CoordinateInverseResult( horizontalDistance = horizontalDistance, heightDifference = heightDifference, slopePercent = slopePercent, slopeDistance = slopeDistance, g12DMS = g12DMS ) }
调用时可以直接解构拿到所有返回值:
val (horizontalDistance, heightDifference, slopePercent, slopeDistance, g12DMS) = coordinateInverseCalculation(p1, p2)
Kotlin多返回值完整指南
首先纠正你的误解:所有Kotlin多返回值方案都支持任意类型,包括你自定义的DMSAngle、Point3D等类,不存在仅支持基础数据类型的限制。不同方案的适用场景和优缺点如下:
1. 自定义数据类(最推荐,适用所有多返回值场景)
- 适用场景:返回2个及以上值,尤其是返回值类型不同、需要明确语义的场景
- 优点:
- 完全类型安全,编译期就能检查类型错误
- 字段有明确命名,代码可读性极高
- 天然支持解构声明,不需要额外处理
- 支持任意数量、任意类型的返回值
- 缺点:需要额外定义一个数据类,对于临时的2-3个返回值场景略繁琐
2. Pair/Triple(适用2-3个返回值的临时场景)
Kotlin标准库提供了Pair<A,B>(2个值)、Triple<A,B,C>(3个值)两个通用数据类,本质也是预定义的data class:
- 示例(返回2个值,一个Double一个自定义DMSAngle):
fun demo(): Pair<Double, DMSAngle> { return Pair(100.0, DMSAngle(30.0, 15.0, 12.0)) } // 调用解构 val (num, angle) = demo() - 优点:不需要自定义类,开箱即用
- 缺点:字段名是默认的
first/second/third,语义不明确,超过3个返回值无法使用
3. 集合/数组(仅推荐返回同类型多值的场景)
- 适用场景:返回多个相同类型的值,比如返回5个Double类型的坐标参数
- 缺点:如果返回值类型不同,需要声明为
List<Any>/Array<Any>,取值时需要强制类型转换,容易出现运行时错误,类型不安全,不推荐用于不同类型多返回值场景
4. 密封类/接口(适用分支结果返回场景)
- 适用场景:返回的结果是不同分支的情况,比如要么计算成功返回结果,要么失败返回错误信息,不是普通多值返回的首选。比如:
sealed class CalculateResult { data class Success(val result: CoordinateInverseResult): CalculateResult() data class Fail(val errorMsg: String): CalculateResult() }
学习资料推荐
- 《Kotlin实战》:官方认证的入门级书籍,专门有章节讲解数据类、解构声明、函数返回值相关内容,适合初学者系统学习
- Kotlin官方中文文档:可参考「基础-数据类」「基础-解构声明」「函数-函数返回值」相关章节,内容权威准确
内容的提问来源于stack exchange,提问作者Sepideh Abadpour
相关产品推荐
相关产品推荐

