Generics 函数返回基接口的泛型类-类型不匹配
第二行到最后一行不编译,但最后一行编译良好:Generics 函数返回基接口的泛型类-类型不匹配,generics,kotlin,Generics,Kotlin,第二行到最后一行不编译,但最后一行编译良好: 原因是什么(他们似乎和我一样) 我可以更改哪些内容,以便在(true)m1 else m2编译时返回 编译错误: 类型不匹配:推断类型为Hold,但应为Hold 接口消息 类HelloMsg:Msg 类别ByeMsg:Msg 类保持(val msg:T) 乐趣测试():保持{ val m1=保持(HelloMsg()) val m2=保持(ByeMsg()) 如果(true)m1 else m2//未编译,则返回 返回if(true)Hold(H
- 原因是什么(他们似乎和我一样)
- 我可以更改哪些内容,以便
编译时返回在(true)m1 else m2
Hold
,但应为Hold
接口消息
类HelloMsg:Msg
类别ByeMsg:Msg
类保持(val msg:T)
乐趣测试():保持{
val m1=保持(HelloMsg())
val m2=保持(ByeMsg())
如果(true)m1 else m2//未编译,则返回
返回if(true)Hold(HelloMsg())else Hold(ByeMsg())//编译
}
我可以修改什么,以便在m1或m2编译时返回(true)
使保持
:类保持(val msg:T)
。然后Hold
和Hold
都将是Hold
的子类型
我想我已经回答了我的第二个问题:
fun test():Hold{…}
是的,这也行,但更适合本地class Hold
基本上等同于使用标有out
的Hold
原因是什么(他们似乎和我一样)
在if(true)m1 else m2
情况下,m1
和m2
的类型已经通过它们的声明固定,并且不同于Hold
在
if(true)Hold(HelloMsg())else Hold(ByeMsg())
中,编译器键入Hold(HelloMsg())
,同时知道它必须是Hold
。因此,它将类型参数推断为Hold(HelloMsg())
。另一个分支也是如此。我想我已经找到了第二个问题的答案:fun test():Hold{…}
interface Msg
class HelloMsg: Msg
class ByeMsg: Msg
class Hold<T: Msg>(val msg: T)
fun test(): Hold<Msg> {
val m1 = Hold(HelloMsg())
val m2 = Hold(ByeMsg())
return if(true) m1 else m2 //DOESN'T COMPILE
return if(true) Hold(HelloMsg()) else Hold(ByeMsg()) //COMPILES
}