You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()
    }
    

学习资料推荐
  1. 《Kotlin实战》:官方认证的入门级书籍,专门有章节讲解数据类、解构声明、函数返回值相关内容,适合初学者系统学习
  2. Kotlin官方中文文档:可参考「基础-数据类」「基础-解构声明」「函数-函数返回值」相关章节,内容权威准确

内容的提问来源于stack exchange,提问作者Sepideh Abadpour

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 09:36:02