列表<? extends Something > 生成而不是 List<Something>
Posted
技术标签:
【中文标题】列表<? extends Something > 生成而不是 List<Something>【英文标题】:List<? extends Something > is generated instead of List<Something> 【发布时间】:2019-07-24 21:41:22 【问题描述】:我有一个返回 JSON 响应的服务调用,该响应随后通过数据管理器传递,如果服务成功则转换数据,如果调用失败则创建错误正文。
数据管理器是用 kotlin 编写的,特定的行 我感兴趣的代码是这个
val mutableList = mutableListOf<Address>()
return Result.error(errorTransformation(serviceErrors, mutableList))
我的errorTransformation 类基本上是一个异常调用,这是用java 编写的。异常类的构造函数是
ExceptionClass(ServiceErrors serviceError ,List<Address> address)
// initiialize fields here
现在,当我尝试初始化我的异常类时,它说找到了适当的构造函数,它向我显示了使用语法生成一个的建议
ExceptionClass(ServiceErrors serviceError ,List<? extends Address> address)
// initiialize fields here
为什么会这样?我只想要List<Address>
,而不是List<? extends Address>
。
【问题讨论】:
只是猜测,但如果将第一行替换为val mutableList = ArrayList<Address>()
是否一切正常?
@BenP.Nope,它不会改变任何东西
kotin 中的集合默认是协变的(与 Java 不同),所以这种行为是有效的。您收到的确切消息/警告是什么?你能把它贴在这里吗?另外,您使用的是哪个 kotlin 版本?
【参考方案1】:
隐式使用List<? extends Address>
而不是List<Address>
是kotlin 的特定行为。您可以使用 @JvmSuppressWildcards
注释强制 kotlin 生成您需要的内容
val mutableList = mutableListOf<@JvmSuppressWildcards Address>()
【讨论】:
我尝试过使用@JvmSuppressWildcardsand
,但没有成功以上是关于列表<? extends Something > 生成而不是 List<Something>的主要内容,如果未能解决你的问题,请参考以下文章
在链接列表中head = something之间的区别是什么?和head.next =某事; [关闭]
连接两个列表 - '+=' 和 extend() 之间的区别