Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Generics 函数返回基接口的泛型类-类型不匹配_Generics_Kotlin - Fatal编程技术网

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
}