如何在Java中判断Kotlin密封类Resource的类型并获取Error的statusCode
解决方案
Kotlin 密封类的子类在Java侧可直接通过instanceof判断类型,对应属性通过Kotlin自动生成的Getter方法访问即可,两种JDK版本适配方案如下:
Java 16及更高版本
Java 16 引入了 instanceof 模式匹配特性,可在类型判断后直接获取转换完成的实例,无需手动强转:
public void processResource(Resource<?> resource) { if (resource instanceof Resource.Error error) { // 直接读取Error实例属性 Integer statusCode = error.getStatusCode(); Throwable exception = error.getException(); // 错误逻辑处理 } else if (resource instanceof Resource.Success success) { Object data = success.getData(); // 成功逻辑处理 } }
Java 8 ~ Java 15 版本
低版本Java不支持模式匹配,判断类型后手动强转即可:
public void processResource(Resource<?> resource) { if (resource instanceof Resource.Error) { Resource.Error error = (Resource.Error) resource; Integer statusCode = error.getStatusCode(); Throwable exception = error.getException(); // 错误逻辑处理 } else if (resource instanceof Resource.Success) { Resource.Success success = (Resource.Success) resource; Object data = success.getData(); // 成功逻辑处理 } }
注意事项
- Kotlin 公开的
val属性会自动编译为Java侧对应的Getter方法,直接调用getXxx格式的方法即可读取属性值,无需额外适配。 - 由于
Resource是密封类,仅存在Error和Success两个合法子类,上述两个分支已覆盖所有正常场景,可按需决定是否新增else分支处理异常边界情况。 - 若明确知晓
Success携带的泛型类型,可指定泛型参数避免读取data时的类型转换警告。
内容的提问来源于stack exchange,提问作者Ashley Baker
相关产品推荐
相关产品推荐

