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
相关产品推荐
相关产品推荐

