如何修复我的代码以删除投射警告?

时间:2016-12-17 14:26:14

标签: kotlin

我有一些类似的代码:

private val elements: ArrayList<ISomeElement> = ArrayList()

...

override fun curElements(): Collection<GenericElement> {  
  ...
  return elements as Collection<GenericElement> // squigly underline here, unchecked cast warning

}

元素中的所有ISomeElement个对象都是实现GenericElement的{​​{1}}个对象

如何修复我的代码以删除此警告?代码工作正常,这只是我要问的警告

我无法更改乐趣的返回类型

1 个答案:

答案 0 :(得分:3)

  1. 如果ISomeElement延长GenericElement,那么您将不会收到此类警告;你甚至不需要使用显式函数返回类型进行显式转换。
  2. 如果ISomeElement没有延伸GenericElement那么就没有安全的方式去&#34;施放&#34; Collection<ISomeElement>Collection<GenericElement>

    您可以map将元素添加到所需类型的新集合中:

    fun curElements(): Collection<GenericElement> {
        return elements.map { it as GenericElement }
    }
    

    如果你知道集合中可能有一些元素没有实现GenericElement并且你想默默地忽略它们,你也可以过滤集合:

    fun curElements(): Collection<GenericElement> {
        return elements.filterIsInstance<GenericElement>()
    }
    

    如果您确定所有elements实施GenericElement,那么您可以取消警告:

    fun curElements(): Collection<GenericElement> {
        @Suppress("UNCHECKED_CAST")
        return elements as Collection<GenericElement>
    }
    

    您还可以将elements的类型更改为ArrayList<GenericElement>,然后在将每个ISomeElement实例添加到GenericElement时将其添加到集合中:

    elements.add(iSomeElement as GenericElement)