You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin的forEach遮蔽SynchronizedSet同步实现,如何调用原同步方法?

调用SynchronizedSet的同步forEach方法

有几种可行的方式绕过Kotlin扩展方法的优先级,直接调用Java SynchronizedSet 自身的同步forEach:

方法一:显式转型为Java的Iterable

Kotlin的Iterable.forEach扩展函数针对的是kotlin.collections.Iterable接口,而Java的SynchronizedSet实现了java.lang.Iterable且重写了同步的forEach方法。通过将集合显式转型为java.lang.Iterable,可以直接调用其同步版本:

val syncSet = Collections.synchronizedSet(mutableSetOf<String>())

// 转型为Java Iterable后调用同步forEach
(syncSet as java.lang.Iterable<String>).forEach { item ->
    // 这里的遍历操作处于SynchronizedSet的锁保护下
}

方法二:手动利用同步块模拟同步遍历

如果不想依赖类型转型,也可以手动获取SynchronizedSet的锁(默认情况下SynchronizedSet的锁就是自身),包裹遍历逻辑,效果与原生同步forEach一致:

val syncSet = Collections.synchronizedSet(mutableSetOf<String>())

synchronized(syncSet) {
    syncSet.forEach { item ->
        // 手动加锁后执行遍历
    }
}

方法三:反射调用(不推荐)

如果上述方法都不适用,可以通过反射直接调用SynchronizedSet的forEach方法,但这种方式代码可读性差且易受版本变化影响:

val syncSet = Collections.synchronizedSet(mutableSetOf<String>())
val forEachMethod = syncSet.javaClass.getMethod("forEach", Consumer::class.java)
forEachMethod.invoke(syncSet, Consumer<String> { item ->
    // 执行遍历逻辑
})

内容的提问来源于stack exchange,提问作者binarynoise

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 08:40:00