函数返回基本接口的通用类-类型不匹配

亚述

倒数第二行不会编译,但最后一行可以正常编译:

  • 是什么原因(它们似乎与我等效)?
  • 我可以更改什么才能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
}
阿列克谢·罗曼诺夫(Alexey Romanov)

我可以更改什么,以便返回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案件的类型m1m2已经通过他们的声明,并从不同的固定Hold<Msg>

if(true) Hold(HelloMsg()) else Hold(ByeMsg())编译器中输入Hold(HelloMsg())时必须知道必须输入Hold<Msg>因此,它将类型参数推断为Hold<Msg>(HelloMsg())与其他分支相同。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

返回类型不匹配(或不匹配)

来自分类Dev

类内通用递归函数的Kotlin类型不匹配

来自分类Dev

RankNTypes与返回类型不匹配

来自分类Dev

VB类型不匹配“返回”

来自分类Dev

RankNTypes与返回类型不匹配

来自分类Dev

函数“递归返回”的“类型不匹配”

来自分类Dev

从函数返回数组时类型不匹配

来自分类Dev

类型类声明类型不匹配

来自分类Dev

返回值类型与函数类型CONST不匹配

来自分类Dev

函数类型与函数定义不匹配

来自分类Dev

类型不匹配错误,声明类列表

来自分类Dev

Scala中的Java类类型不匹配?

来自分类Dev

ParamConverterProvider方法返回类型不匹配

来自分类Dev

Excel VBA With语句返回类型不匹配

来自分类Dev

IDispatch Invoke()返回类型不匹配

来自分类Dev

返回数据类型不匹配

来自分类Dev

Android ASyncTask返回类型不匹配

来自分类Dev

Haskell 新手:返回类型不匹配

来自分类Dev

Haskell:函数组合的类型不匹配

来自分类Dev

重载函数的地址与所需类型不匹配

来自分类Dev

函数调用导致类型13不匹配

来自分类Dev

fortran类型不匹配调用函数

来自分类Dev

VBA函数结果类型不匹配

来自分类Dev

Haskell函数中的类型不匹配

来自分类Dev

Scala 中的类型不匹配(hasNext 函数)

来自分类Dev

Kotlin - 高阶函数和类型不匹配

来自分类Dev

map函数中的Scala类型不匹配

来自分类Dev

错误:声明要返回的函数中的返回类型不匹配

来自分类Dev

错误:声明要返回的函数中的返回类型不匹配