为何在Kotlin中触发java.lang.ClassCastException异常?
问题原因与解决方案
异常原因
这段代码抛出java.lang.ClassCastException的核心问题是父类实例无法强转为子类类型:
- 你传入的
message = Message(text = "Text")是父类Message的实例,并非子类TextMessage的实例 - 在
handleUpdate函数中,仅通过update.message.text != null就判定可以转成TextMessage,这是错误逻辑——text不为null不代表当前实例是TextMessage,父类Message同样可以拥有非null的text值
修复方案
要正确区分Message和TextMessage实例,应该用类型判断而非仅判断text是否为null,修改handleUpdate函数:
fun handleUpdate(update: Update): Event { if (update.message != null) { return when (update.message) { is TextMessage -> TextMessageReceiveEvent(update.message) else -> MessageReceiveEvent(update.message) } } error("Update message is null.") }
这样不管父类Message的text是否为null,都会根据实际类型返回对应的Event,避免了错误的强转操作。
另外,如果你希望通过text是否为null来区分两种Event,需要确保只有TextMessage的text是非null的,父类Message的text保持null。但这种设计不如直接基于类型判断可靠,因为父类实例依然可能被设置非null的text值。
内容的提问来源于stack exchange,提问作者Dj Sushi
相关产品推荐
相关产品推荐

