这个泛型接口是否有任何错误,或者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
事件
这个
可以是
事件
类型的任何值,包括
消息创建事件