下面的代码无法编译,出现以下错误:
错误:(28,61)类型不匹配:推断类型是字符串,但没有预期
我不清楚为什么会这样。我想要实现的是,filterMap
采用任何类型的过滤器,并将其应用于传入的数据。从用于测试的数组中可以看到:arrayListOf("Message1", 1, 'C')
。究竟是否有这个目标呢?我可以通过指定MutableMap<Filter<Any>, String>
来修复它,但是这意味着我的过滤器也必须是(Any) -> Boolean
类型的。
class Filter<Q> (val predicate: (Q) -> Boolean, val isEnabled: Boolean) {
constructor(predicate: (Q) -> Boolean) : this(predicate, false)
override fun equals(other: Any?): Boolean {
if (other == null || other !is Filter<*>) {
return false
}
return isEnabled == other.isEnabled && predicate == other.predicate
}
override fun hashCode(): Int {
return 0x31 xor predicate.hashCode() xor isEnabled.hashCode()
}
}
val filterMap: MutableMap<Filter<*>, String> = HashMap()
fun main(args: Array<String>) {
val messages = arrayListOf("Message1", 1, 'C')
val isMessage1: (String) -> Boolean = { it == "Message1" }
val isMessage1Filter = Filter(isMessage1)
filterMap.put(isMessage1Filter, "Matched Message1")
messages.forEach { message ->
filterMap.filterKeys { it.isEnabled || (it.predicate(message)) }
.forEach {
it.value.forEach {
println(it)
}
}
}
}
发布于 2019-01-11 04:46:53
过滤器是用星型投影:Filter<*>
定义的,当您从映射中获取函数时,它将生成一个函数(Nothing) -> Boolean
:
val pred = it.predicate //inferred type: (Nothing) -> Boolean
这就是为什么编译器不接受String
作为参数的原因。
而且,您的messages
是ArrayList<Any>
类型的,您不能只使用它们作为String
。
Kotlin是一种静态类型的语言,它不允许这些不安全的尝试。
要解决这个问题,您可以将所有内容更改为String
泛型:
val filterMap: MutableMap<Filter<String>, String>> = mutableMapOf()
val messages = listOf("Message1")
我知道,这不会让你满意,因为你正在寻找一个通用的解决方案。但是,您必须找到一种方法来安全地转换您从非特定集合中获取的实体。
https://stackoverflow.com/questions/54146749
复制