java - 智能转换为 'ObserverT!!' 是不可能的,因为 'item.get()' 是一个复杂的表达式

标签 java android kotlin rx-java type-inference

我将 Java 代码转换为 Kotlin(Android Studio 的自动转换),但收到以下错误:

enter image description here

Java 方法如下所示:

 /**
 * The list of weak reference to the observers.
 */
protected List<WeakReference<ObserverT>> observers = new ArrayList<>();

/**
 * Calls the specified action for each observer.
 * @param action action to be called.
 */
protected void foreachObserver(@NonNull final INotificationCallback<ObserverT> action) {
    final List<ObserverT> tempObserverList = new ArrayList<>();
    final List<WeakReference<ObserverT>> listToRemove = new ArrayList<>();
    synchronized (this) {
        if (!hasChanged()) {
            return;
        }
        clearChanged();

        if (observers.isEmpty()) {
            return;
        }

        for (final WeakReference<ObserverT> item : observers) {
            if (item.get() == null) {
                listToRemove.add(item);
            } else {
                tempObserverList.add(item.get());
            }
        }

        if (!listToRemove.isEmpty()) {
            observers.removeAll(listToRemove);
        }
    }
    notify(tempObserverList, action);
}

Kotlin 中转换后的代码:

 /**
 * The list of weak reference to the observers.
 */
protected var observers: MutableList<WeakReference<ObserverT>> = ArrayList()

/**
 * Calls the specified action for each observer.
 * @param action action to be called.
 */
protected fun foreachObserver(@NonNull action: INotificationCallback<ObserverT>) {
    val tempObserverList: MutableList<ObserverT> = ArrayList()
    val listToRemove: MutableList<WeakReference<ObserverT>> = ArrayList()
    synchronized(this) {
        if (!hasChanged()) {
            return
        }
        clearChanged()
        if (observers.isEmpty()) {
            return
        }
        for (item in observers) {
            if (item.get() == null) {
                listToRemove.add(item)
            } else {
                tempObserverList.add(item.get()) // This line throws an error
            }
        }
        if (listToRemove.isNotEmpty()) {
            observers.removeAll(listToRemove)
        }
    }
    notify(tempObserverList, action)
}

我没有找到解决方案,因为我不正确理解它。任何指导将不胜感激。

感谢您的宝贵时间

最佳答案

由于 item.get() 在检查它和将其添加到列表之间不一定保持不变,因此您应该将其存储在变量中。

val x = item.get()
if (x == null) {
  listToRemove.add(item)
} else {
  tempObserverList.add(x) // No more error
}

关于java - 智能转换为 'ObserverT!!' 是不可能的,因为 'item.get()' 是一个复杂的表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62184309/

相关文章:

android - Eclipse ADT bundle 链接在哪里?

java - 不幸的是 MyApp 已经停止。我该如何解决这个问题?

Apache Commons CollectionsUtils.select 的 Java 8 Lambda 替换

java - 关闭 DAO 对象中的连接

java - MediaStore.EXTRA_OUTPUT 呈现数据为空,其他保存照片的方式?

unit-testing - Kapt generatetubs - 无法使用单元测试中的内部构造函数初始化对象

hibernate - 无法使用和另一个And Or一起使用条件api构建查询

java - 从整数列表的索引中打印字符串

java - 将后端代码(Java、Python)与 HTML 集成

java - 单独的相机类别还是合并在一起?