倒数第二行不会编译,但最后一行可以正常编译:
return if(true) m1 else m2
编译?编译错误:
类型不匹配:推断的类型是
Hold<HelloMsg>
但Hold<Msg>
预期
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
}
我可以更改什么,以便返回if(true)m1 else m2可以编译?
使Hold
协变:class Hold<out T: Msg>(val msg: T)
。然后Hold<HelloMsg>
和Hold<ByeMsg>
都是的子类型Hold<Msg>
。
我想我对第二个问题有答案:
fun test(): Hold<out Msg> { ... }
是的,它也可以,但是在本地更有效。class Hold<out T>
基本上等同于使所有的用途Hold
打上out
。
是什么原因(它们似乎与我等效)?
在if(true) m1 else m2
案件的类型m1
和m2
已经通过他们的声明,并从不同的固定Hold<Msg>
。
在if(true) Hold(HelloMsg()) else Hold(ByeMsg())
编译器中输入Hold(HelloMsg())
时必须知道必须输入Hold<Msg>
。因此,它将类型参数推断为Hold<Msg>(HelloMsg())
。与其他分支相同。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句