Arrays Kotlin:For循环必须有一个迭代器方法-这是一个bug吗?

Arrays Kotlin:For循环必须有一个迭代器方法-这是一个bug吗?,arrays,kotlin,Arrays,Kotlin,我有以下代码: public fun findSomeLikeThis(): ArrayList<T>? { val result = Db4o.objectContainer()!!.queryByExample<T>(this as T) as Collection<T> if (result == null) return null return ArrayList(result) } public fun findSomeLi

我有以下代码:

public fun findSomeLikeThis(): ArrayList<T>? {
    val result = Db4o.objectContainer()!!.queryByExample<T>(this as T) as Collection<T>
    if (result == null) return null
    return ArrayList(result)
}
public fun findSomeLikeThis():ArrayList?{
val result=Db4o.objectContainer()!!.queryByExample(此为T)作为集合
if(result==null)返回null
返回ArrayList(结果)
}
如果我这样称呼它:

var list : ArrayList<Person>? = p1.findSomeLikeThis()

for (p2 in list) {
    p2.delete()
    p2.commit()
}
var列表:ArrayList?=p1.找到一些类似于此()
用于(列表中的p2){
p2.删除()
p2.提交()
}
这会给我一个错误:

For循环范围必须具有“iterator()”方法


我在这里遗漏了什么吗?

您的
ArrayList
是可空类型。所以,你必须解决这个问题。有几种选择:

for (p2 in list.orEmpty()) { ... }

或者您可以返回一个空列表

public fun findSomeLikeThis(): List<T> //Do you need mutable ArrayList here?
    = (Db4o.objectContainer()!!.queryByExample<T>(this as T) as Collection<T>)?.toList().orEmpty()
public fun findSomeLikeThis():List//此处是否需要可变数组列表?
=(Db4o.objectContainer()!!.queryByExample(作为T)作为集合)?.toList().orEmpty()

当我在某些东西上循环它不是数组时,我也会遇到这个问题。
范例

fun最大值(价格:数组){
val sortedPrices=prices.sort()
for(price in sortedPrices){//它将显示for循环范围,这里必须有迭代器(因为`prices.sort`不返回单位而不是数组)
}
}

这与这个问题的情况不同,但希望它能有所帮助

当您从共享首选项中读取数据并获得一个(可能)可为空的iterable对象(如
StringSet
)时,Android中也会出现这种情况。即使提供默认值,编译器也无法确定返回的值实际上永远不会为null。我找到的唯一解决方法是使用
断言返回的表达式不是null运算符,如下所示:

val prefs = PreferenceManager.getDefaultSharedPreferences(appContext)
val searches = prefs.getStringSet("saved_searches", setOf())!!
for (search in searches){
    ...
}
试一试


或者list?.forEach{it.delete()…}
list?.forEach{…}
处理空值(如上所述,只是在其周围添加代码块),这应该是可以接受的答案。这是唯一一个对我有用的。
fun maximum(prices: Array<Int>){
    val sortedPrices = prices.sort()
    for(price in sortedPrices){ // it will display for-loop range must have iterator here (because `prices.sort` don't return Unit not Array)

    }
}
val prefs = PreferenceManager.getDefaultSharedPreferences(appContext)
val searches = prefs.getStringSet("saved_searches", setOf())!!
for (search in searches){
    ...
}
for(p2 in 0 until list.count()) {
    ...
    ...
}