列表<? 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&lt;Address&gt;,而不是List&lt;? extends Address&gt;

【问题讨论】:

只是猜测,但如果将第一行替换为 val mutableList = ArrayList&lt;Address&gt;() 是否一切正常? @BenP.Nope,它不会改变任何东西 kotin 中的集合默认是协变的(与 Java 不同),所以这种行为是有效的。您收到的确切消息/警告是什么?你能把它贴在这里吗?另外,您使用的是哪个 kotlin 版本? 【参考方案1】:

隐式使用List&lt;? extends Address&gt; 而不是List&lt;Address&gt;kotlin 的特定行为。您可以使用 @JvmSuppressWildcards 注释强制 kotlin 生成您需要的内容

val mutableList = mutableListOf<@JvmSuppressWildcards Address>()

【讨论】:

我尝试过使用@JvmSuppressWildcardsand,但没有成功

以上是关于列表<? extends Something > 生成而不是 List<Something>的主要内容,如果未能解决你的问题,请参考以下文章

"? extends ParentClass" 使只读?

如何将每个 Json 属性写入没有其内容的列表

在链接列表中head = something之间的区别是什么?和head.next =某事; [关闭]

连接两个列表 - '+=' 和 extend() 之间的区别

连接两个列表 - '+=' 和 extend() 之间的区别

也谈python列表append和extend的区别