当前位置: 首页 > 知识库问答 >
问题:

聪明的演员要‘观察!!'是不可能的,因为“item.get()”是一个复杂的表达式

楚俊迈
2023-03-14

我将Java代码转换为静态编程语言(Android Studio的自动转换),我得到以下错误:

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);
}

静态编程语言中的转换代码:

 /**
 * 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)
}

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

感谢您抽出宝贵时间接受采访

共有1个答案

巫马承德
2023-03-14

因为< code>item.get()在您检查它和将其添加到列表之间不一定保持不变,所以您应该将它存储在一个变量中。

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