我正在努力做到以下几点:
inline fun <reified T> getMapper(klass: Class<T>): RFMFunction<T, Event> =
when (klass) {
MClick::class.java -> MClickMapper
else -> { throw RuntimeException("Unknown event type: $klass") }
}
与:
object MClickMapper : RFMFunction<MClick, Event>()
但是Kotlin没有意识到MClickMapper
是RFMFunction<MClick, Event>
的子类。
我尝试在when
中添加强制转换as RFMFunction<MClick, Event>
,但没有成功。
我得到的错误是:
Type mismatch.
Required: RFMFunction<T, Event>
Found: ClickMapper
有办法做到吗?
谢谢!
1条答案
按热度按时间goqiplq21#
Kotlin无法识别MClickMapper是RFMFunction〈MClick,Event〉的子类
这不完全正确。错误是
Type mismatch: inferred type is MClickMapper but RFMFunction<T, Event> was expected
。所以实际上,Kotlin拒绝将
MClickMapper
视为RFMFunction<T, Event>
的子类,因为T
是由函数的 caller 提供的,编译器并不知道klass == MClick::class.java
意味着T == MClick
。(因为您知道的比编译器多),但是它应该是一个到RFMFunction<T, Event>
(而不是RFMFunction<MClick, Event>
)的强制转换,然后您可以取消未检查的强制转换警告。另外,顺便提一句,为什么要同时使用
KClass
和reified
类型参数呢?如果要具体化T
,就不需要显式的KClass
:但是,此解决方案并不好,因为您需要将
MClickMapper
和MClick
之间的关系硬编码两倍(在继承层次结构中的when
AND中),这意味着如果这两个位置不同步,您可能会遇到编译时看不到的问题。最好使用类型信息来动态创建Map,这样你就可以把Map编码在一个地方。