如何从LinkedSetOf返回带有列表数据的MutableSet?

时间:2019-08-12 02:39:47

标签: android kotlin type-mismatch

“我正在准备创建MutableSet,如何从LinkedHashSet中返回它?”

“有列表数据,然后我尝试从具有列表数据的LinkedHashSet创建一个MutableSet。”

在Java中,我创建一个这样的Set:

private Set<Item> mItems;
public void onCreate(Bundle bundle) {
        if (bundle == null) {
            mItems = new LinkedHashSet<>();
        } else {
            List<Item> saved = bundle.getParcelableArrayList(STATE_SELECTION);
            mItems = new LinkedHashSet<>(saved);
        }
    }

在科特林,我写了这样的代码:

var mItems: MutableSet<Item>? = null
fun onCreate(bundle: Bundle?) {
        if (bundle == null) {
            mItems = linkedSetOf()
        } else {
            val saved = bundle.getParcelableArrayList<Item>(STATE_SELECTION)
            mItems = linkedSetOf(saved)
        }
    }

但是AndroidStudio编译器发出类型不匹配警报:Required:Item,Found:ArrayList!

还是我需要这样做?:

mItems = linkedSetOf(saved) as MutableSet<Item>

我使用隐蔽的Java编写Kotlin,它会生成如下代码:

mItems = LinkedHashSet(saved)

但是LinkedHashSet来自java.util.LinkedHashSet,kotlin中是否有一些更惯用的方法?

2 个答案:

答案 0 :(得分:0)

您可以写linkedSetOf(*saved.toTypedArray())。不知道它是否更惯用:)可以在Kotlin中使用Java中的某些东西。在下面,linkedSetOf也使用LinkedHashSet

答案 1 :(得分:0)

当您要求LinkedHashSet时,Kotlin始终会创建一个MutableSet,因此您可以使用标准方法。

private lateinit var mItems: MutableSet<Item>

public override fun onCreate(bundle: Bundle?) {
    mItems = bundle?.getParcelableArrayList(STATE_SELECTION)
                   ?.toMutableSet() ?: mutableSetOf()
}