这个泛型接口是否有任何错误,或者Kotlin编译器无法推断类型?
假设我们有一个适配器接口:这个泛型接口是否有任何错误,或者Kotlin编译器无法推断类型?,kotlin,generics,Kotlin,Generics,假设我们有一个适配器接口: 接口事件适配器{ val事件:E // ... } 以及一些实现: 内联类MessageCreateAdapter(覆盖val事件:MessageCreateEvent):事件适配器{/*…*/} 内联类MessageUpdateAdapter(重写val事件:MessageUpdateEvent):事件适配器{/*…*/} // ... 我们创建事件的扩展以获得相应的适配器: fun E.toAdapter():事件适配器?{ 返回时(此){ 是MessageC
接口事件适配器{
val事件:E
// ...
}
以及一些实现:
内联类MessageCreateAdapter(覆盖val事件:MessageCreateEvent):事件适配器{/*…*/}
内联类MessageUpdateAdapter(重写val事件:MessageUpdateEvent):事件适配器{/*…*/}
// ...
我们创建事件的扩展以获得相应的适配器:
fun E.toAdapter():事件适配器?{
返回时(此){
是MessageCreateEvent->MessageCreateAdapter(此)
是MessageUpdateEvent->MessageUpdateAdapter(此)
else->null
}
}
然后编译器抱怨MessageCreateAdapter
和MessageUpdateAdapter
不是EventAdapter?
。我不知道问题出在哪里,也不知道这个问题在哪里
附加了一条最小编译错误消息当expressinon作为
MessageCreateAdapter
和MessageUpdateAdapter
(+nullable)的最特定超类型时,编译器推断出该的类型,即EventAdapter?
。问题在于编译器并没有试图证明此表达式的计算依赖于E
,因此当分支时,结果类型可能不仅仅是所有中最具体的超类型,而是通过E
来强调,所以您需要帮助他并进行一些手动转换:
@Suppress(“未选中的\u CAST”)
乐趣E.toAdapter():事件适配器?{
返回时(此){
MessageCreateEvent->MessageCreateAdapter(此)是否为EventAdapter
MessageUpdateEvent->MessageUpdateAdapter(此)是否为EventAdapter
else->null
}
}
对于不成立的情况:当是MessageCreateEvent
(例如)匹配时,并不意味着E
是MessageCreateEvent
;例如,它可能只是事件
。在这种情况下,您需要返回一个EventAdapter
。但是您返回一个MessageCreateAdapter
,它扩展了EventAdapter
,而不是EventAdapter
如果您使用了接口事件适配器
,我认为理论上它可以工作,但仍然不会工作,原因在Маааааафааааааааааааа,问题是编译器无法在编译时检查EventAdapter?
是否是MessageCreateAdapter
或messageupdatedapter
的父类型是的,完全忘记了显式泛型传递不需要显式传递,只要在一个vale:Event
:)@AlexeyRomanov你能澄清一下吗?如果是MessageCreateEvent
匹配,在什么情况下E
不是MessageCreateEvent
?你说它可能只是事件
,但如果是这样的话,它如何匹配MessageCreateEvent
?@mowwalker如果我是正确的泛型只在编译时存在,至少非具体化的泛型。因此,如果我存储一个事件,比如val ev:event=MessageCreateEvent(…)
并调用ev.toAdapter()
,那么基本上假设E作为event
传递,而不是MessageCreateEvent
,因为我们在运行时不处理泛型:)嗯,这在使用非擦除泛型的语言(例如C#)中也同样适用。只是如果E
是事件
,这个
可以是事件
类型的任何值,包括消息创建事件
。