Kotlin使用自定义TokenCommandResult密封类报错且跳转实现异常如何修复
问题原因
- 你定义的
TokenCommandResult内部的Success、Error、Fault都是带构造参数的普通嵌套类,不是单例object,无法直接作为常量在模式匹配分支中直接引用类名匹配,所以编译器抛出「不是一个值」的错误 - 匹配语法不符合规则:如果是Kotlin环境应使用
when表达式做分支判断,匹配类型需要使用is关键字;如果是Scala互调用match,也需要匹配类类型而非直接引用类名 - 跳转不到自定义源码是因为编译期语法校验不通过,IDE无法关联源文件索引,只能定位到编译后的字节码文件
修复方案
场景1:Kotlin环境下的代码修复
将匹配逻辑替换为正确的when表达式写法,通过is匹配子类类型,Kotlin会自动做智能转换,可直接读取子类的属性:
when (result) { is TokenCommandResult.Success -> printError("w", result.response.toString()) is TokenCommandResult.Error -> printError(format, result.error.errorObject.description) is TokenCommandResult.Fault -> printError(format, result.exception.message.orEmpty()) }
场景2:Scala调用Kotlin代码的修复
调整match的分支写法,匹配类类型并绑定变量后读取属性:
result match { case success: TokenCommandResult.Success => printError("w", success.response.toString) case error: TokenCommandResult.Error => printError(format, error.error.errorObject.description) case fault: TokenCommandResult.Fault => printError(format, fault.exception.getMessage) }
修复后重新构建项目即可解决编译报错,IDE也能正常跳转到你自定义的密封类源码。
内容的提问来源于stack exchange,提问作者user15826601
相关产品推荐
相关产品推荐

