如何解决在HashMap中为Class <in Throwable>中的lambda映射
我想创建一个映射,以映射异常类的类型并关联一个函数以供以后执行。
select * from "user";
我插入map并将其传递给函数:
sealed class HttpErrors(open var errorMessage: String = String()) : Throwable()
class UnauthorizedError(override var errorMessage: String) : HttpErrors()
class BadRequestError(override var errorMessage: String) : HttpErrors()
fun handleErrors(actions: HashMap<Class<out Throwable>,() -> Unit>){
...
}
接收地图的我:
override fun getItems() {
...
val actions = hashMapOf(BadRequestError::class.java to {presenter.log("Info")})
...
.onDefaultSchedulers(actions)
但是编辑抱怨说:
fun <T> Single<T>.onDefaultSchedulers(actions: HashMap<Class<in Throwable>,() -> Unit>): Single<T>
如果BadRequestError继承自Throwable,我不会理解这个抱怨。
解决方法
这是代码的最低版本,它再现了您所观察到的错误:
/* does not compile */
sealed class HttpErrors : Throwable()
class BadRequestError : HttpErrors()
fun onDefaultSchedulers(actions: HashMap<Class<out Throwable>,() -> Unit>) {}
fun getItems() {
val actions = hashMapOf(BadRequestError::class.java to {})
onDefaultSchedulers(actions) // <- type mismatch
}
要使其正常工作,actions
的{{1}}参数需要两级协方差,
- 位于外部
onDefaultSchedulers
和 - 位于内部
Class<...>
上。
因此,如果您将其声明为Throwable
HashMap<
out
,则代码会编译:
Class<out Throwable>,...
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。