Kotlin 类的lambda映射<;可丢弃的>;在HashMap中

Kotlin 类的lambda映射<;可丢弃的>;在HashMap中,kotlin,generics,Kotlin,Generics,我想创建一个映射,映射异常类的类型,并关联一个函数以供以后执行 sealed class HttpErrors(open var errorMessage: String = String()) : Throwable() class UnauthorizedError(override var errorMessage: String) : HttpErrors() class BadRequestError(override var errorMessage: String) : HttpE

我想创建一个映射,映射异常类的类型,并关联一个函数以供以后执行

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>){
...
}
我的朋友收到了地图:

fun <T> Single<T>.onDefaultSchedulers(actions: HashMap<Class<in Throwable>, () -> Unit>): Single<T> 
fun Single.ondefaultscheduler(操作:HashMap Unit>):Single
但编辑抱怨说:

Type mismatch.
Required:
kotlin.collections.HashMap<Class<in Throwable>, () → Unit> /* = java.util.HashMap<Class<in Throwable>, () → Unit> */
Found:
kotlin.collections.HashMap<Class<BadRequestError>, () → Unit> /* = java.util.HashMap<Class<BadRequestError>, () → Unit> */
类型不匹配。
必修的:
kotlin.collections.HashMap/*=java.util.HashMap*/
发现:
kotlin.collections.HashMap/*=java.util.HashMap*/

如果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
}

中表示逆变。可接受的类型层次结构与具有协变
out
类型(如
List
始终具有)的内容相反。例如,在
上运行的函数不能在
Int
的超类型上运行,例如
Number
,因为它可能使用
Number
没有的
Int
函数。@Tenfour04已修复。即使没有我们,我也会犯同样的错误。
/* 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
}
/* compiles */

sealed class HttpErrors : Throwable()

class BadRequestError : HttpErrors()

fun onDefaultSchedulers(actions: HashMap<out Class<out Throwable>, () -> Unit>) {}

fun getItems() {
    val actions = hashMapOf(BadRequestError::class.java to {})
    onDefaultSchedulers(actions)
}