首页 > 解决方案 > 智能投射到“ObserverT!!” 是不可能的,因为 'item.get()' 是一个复杂的表达式

问题描述

我将 Java 代码转换为 Kotlin(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);
}

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

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

谢谢你的时间

标签: javaandroidkotlinrx-javatype-inference

解决方案


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

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

推荐阅读