如何从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
相关产品推荐
相关产品推荐

