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

Kotlin密封类层级问题:MVI模式下UseCaseResult移文件报错解决

解决MVI模式下UseCaseResult移至独立文件的构造访问权限问题

这个问题我之前做MVI开发时也碰到过,核心原因是Kotlin sealed类的主构造函数默认是private的——当你把UseCaseResult和AttendLeaveEventResult放在同一个文件时,同一个文件内的类可以访问这个private构造;但移到独立文件后,跨文件的子类就无法调用父类的private构造了,所以才会抛出Cannot access <init>: it is private in UseCaseResult的错误。

解决步骤很简单:

只需要把UseCaseResult的主构造函数可见性改成protected,这样子类(即使在不同文件)就能合法调用父类构造了。

修改后的独立文件UseCaseResult.kt代码:

sealed class UseCaseResult<R> protected constructor() { 
    open class SomeFetching<R> : UseCaseResult<R>() 
    data class Success<R>(val result: R) : UseCaseResult<R>() 
    data class Failure<R>(val error: Throwable) : UseCaseResult<R>() 
}

你的AttendLeaveEventResult代码可以保持不变:

sealed class AttendLeaveEventResult : UseCaseResult<AttendLeaveEventResult>()

补充说明:

  • protected修饰符保证只有UseCaseResult的子类(包括跨文件的同包子类)能访问构造函数,既解决了权限问题,又保留了sealed类限制继承范围的特性。
  • 如果你的项目使用Kotlin 1.1及以上版本,sealed类的子类允许放在同一个包的不同文件中,这个修改完全符合语法规范。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 08:22:28