Kotlin类型转换报错:无法将内部类转为java.util.function.Predicate
解决ClassCastException:方法引用转Predicate失败问题
问题原因
HttpStatus.BAD_REQUEST::equals 是对Object.equals(Object)方法的引用,对应的函数式接口是BiPredicate<Object, Object>(因为equals方法接收一个Object类型参数,同时隐含this作为第一个参数)。你通过as Predicate<HttpStatus>进行的强制转换属于不安全的类型转换,编译阶段不会报错,但运行时实际对象是BiPredicate的实现类。后续调用or方法时,返回的依然是BiPredicate的内部类实例,最终赋值给Predicate<HttpStatus>变量时,就触发了ClassCastException。
解决方案
提供三种可行的修复方式,按需选择:
方式一:用Lambda表达式明确Predicate类型
直接用lambda包装equals调用,确保符合Predicate单参数的定义:
class WebClientErrorHandlerBuilder { private var functionalErrorPredicate: Predicate<HttpStatus> init { functionalErrorPredicate = Predicate { status -> HttpStatus.BAD_REQUEST.equals(status) }.or { HttpStatus.CONFLICT.equals(it) } .or { HttpStatus.NOT_FOUND.equals(it) } } }
方式二:使用JDK内置的Predicate.isEqual方法
JDK的Predicate.isEqual(Object targetRef)方法会返回一个Predicate,专门用于判断输入对象是否等于目标值,类型安全且简洁:
class WebClientErrorHandlerBuilder { private var functionalErrorPredicate: Predicate<HttpStatus> init { functionalErrorPredicate = Predicate.isEqual(HttpStatus.BAD_REQUEST) .or(Predicate.isEqual(HttpStatus.CONFLICT)) .or(Predicate.isEqual(HttpStatus.NOT_FOUND)) } }
方式三:Kotlin集合判断(最简洁)
将错误状态存入集合,利用Kotlin的in操作符构建Predicate,可读性最高:
class WebClientErrorHandlerBuilder { private var functionalErrorPredicate: Predicate<HttpStatus> init { val errorStatuses = setOf(HttpStatus.BAD_REQUEST, HttpStatus.CONFLICT, HttpStatus.NOT_FOUND) functionalErrorPredicate = Predicate { it in errorStatuses } } }
内容的提问来源于stack exchange,提问作者Aymen Kanzari
相关产品推荐
相关产品推荐

