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

如何从Sealed Interface访问Data Class结果对象

问题描述

我使用的库采用了密封接口(Sealed Interface)和数据类(Data Class),相关定义及使用场景如下:

库中接口定义

public sealed interface TransactionProcessingResult {
public final data class Approved public constructor(authorisationResponse: kotlin.String, authorisationResponseDetails: kotlin.String, receiptData: com...models.ProcessedTransactionReceiptData) : com...models.TransactionProcessingResult {
    public final val authorisationResponse: kotlin.String /* compiled code */

    public final val authorisationResponseDetails: kotlin.String /* compiled code */

    public final val receiptData: com...models.ProcessedTransactionReceiptData /* compiled code */

    public final operator fun component1(): kotlin.String { /* compiled code */ }

    public final operator fun component3(): com...models.ProcessedTransactionReceiptData { /* compiled code */ }

    public open operator fun equals(other: kotlin.Any?): kotlin.Boolean { /* compiled code */ }

    public open fun hashCode(): kotlin.Int { /* compiled code */ }

    public open fun toString(): kotlin.String { /* compiled code */ }
}

public final data class ApprovedWithSignature public constructor(authorisationResponse: kotlin.String, authorisationResponseDetails: kotlin.String, receiptData: com...models.ProcessedTransactionReceiptData) : com...models.TransactionProcessingResult {
    public final val authorisationResponse: kotlin.String /* compiled code */

    public final val authorisationResponseDetails: kotlin.String /* compiled code */

    public final val receiptData: com...models.ProcessedTransactionReceiptData /* compiled code */

    public final operator fun component1(): kotlin.String { /* compiled code */ }

    public final operator fun component3(): com...models.ProcessedTransactionReceiptData { /* compiled code */ }

    public open operator fun equals(other: kotlin.Any?): kotlin.Boolean { /* compiled code */ }

    public open fun hashCode(): kotlin.Int { /* compiled code */ }

    public open fun toString(): kotlin.String { /* compiled code */ }
}

public final data class NotApproved public constructor(authorisationResponse: kotlin.String, authorisationResponseDetails: kotlin.String, receiptData: com...models.ProcessedTransactionReceiptData) : com...models.TransactionProcessingResult {
    public final val authorisationResponse: kotlin.String /* compiled code */

    public final val authorisationResponseDetails: kotlin.String /* compiled code */

    public final val receiptData: com...ProcessedTransactionReceiptData /* compiled code */

    public final operator fun component1(): kotlin.String { /* compiled code */ }

    public final operator fun component3(): com...models.ProcessedTransactionReceiptData { /* compiled code */ }

    public open operator fun equals(other: kotlin.Any?): kotlin.Boolean { /* compiled code */ }

    public open fun hashCode(): kotlin.Int { /* compiled code */ }

    public open fun toString(): kotlin.String { /* compiled code */ }
}

调用的库方法

public abstract fun startPurchaseTransaction(amount: kotlin.Long, otherAmount: kotlin.Long, currency: java.util.Currency, metadata: kotlin.String, surchargeEnabled: kotlin.Boolean, tippingEnabled: kotlin.Boolean, onSuccess: com...Success<com...models.TransactionProcessingResult>, onFailure: com...api.Failure<com...api.models.TransactionProcessingError>): kotlin.Unit

使用示例

startPurchaseTransaction(
            500,                     //Amount
            0,                         //Other amount
            nzdCurrency,               //Currency
            "This is metadata",        // metadata
            false,                     //Tipping disabled
            true,                      //Surcharge enabled

            //Success
            (result) -> {
                //how to access result as object/class
                
            },

            //Failure
            error -> {
                //how to access error as object/class
                
            }
    );

我需要在成功回调里判断result是Approved、ApprovedWithSignature还是NotApproved类型,能否将result转换为对应数据类?并获取authorisationResponseDetails和receiptData等详情?


解决方案

完全可以利用Kotlin密封接口的特性来处理,密封接口的子类数量有限且明确,你可以通过when表达式实现类型判断和智能转换,无需手动强转:

示例代码

startPurchaseTransaction(
    500,
    0,
    nzdCurrency,
    "This is metadata",
    false,
    true,
    // Success回调
    { result ->
        when(result) {
            is Approved -> {
                // 自动智能转换为Approved类型,直接访问属性
                val authDetails = result.authorisationResponseDetails
                val receipt = result.receiptData
                // 处理已授权逻辑
            }
            is ApprovedWithSignature -> {
                val authDetails = result.authorisationResponseDetails
                val receipt = result.receiptData
                // 处理带签名的授权逻辑
            }
            is NotApproved -> {
                val authDetails = result.authorisationResponseDetails
                val receipt = result.receiptData
                // 处理未授权逻辑
            }
        }
    },
    // Failure回调
    { error ->
        // 若TransactionProcessingError是密封类/枚举,也可通过when做类似类型判断
        // 直接通过.error属性访问详情,比如error.errorCode、error.message等
    }
)

关键说明

  • 智能转换:Kotlin编译器会在when的每个分支中自动将result转换为对应子类类型,不需要手动调用as强转,安全且简洁。
  • 完整性检查:如果后续密封接口新增子类,编译器会提示你补充对应的when分支,避免遗漏处理逻辑。
  • 属性访问:数据类的所有属性都是公开可访问的,直接通过.操作符即可获取。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 07:22:50