&#39;列表<T>&#39;可能不包含类型&#39;对象&#39;

时间:2015-12-13 20:10:35

标签: java android collections


这可能是一个不属于Object

的孩子的班级

长:
我正在使用List<T>,其中包含接口的实现(Operation):

public class OperationQueue<T extends Operation> {

    private final List<T> mQueue = new ArrayList<>();
    ...
}

当我在循环中浏览此列表时,我将每个已完成的操作标记为null,因为我必须保持相同的大小并且我不能使用迭代器(它抛出ConcurrentModificationException):

for (int i = 0; i < mQueue.size() && !mState.equals(State.PAUSED); i++) {
    mOperation = mQueue.get(i);
    if (mOperation != null) {
        mOperation.run();
    }
    mQueue.set(i, null);
}

当我暂停或完成队列执行时,我使用:

mQueue.removeAll(Collections.singleton(null));

Android Studio向我显示警告:

'List<T>' may not contain type objects of type 'Object'

怎么可能?我以为一切都是Object的孩子?

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:10)

所有 都是<{1}}的孩子:但您的列表需要它们是Object的子类的特定类型,即:类型{{1 }}

Object不是Ts的集合。试试T;通过在方法调用中添加说明符,可以获得指定类型的集合。

答案 1 :(得分:2)

在Java中,所有类都派生自Object类。唯一的例外是原始类型,它们根本不是类。所以简短的回答是“不”,没有一个类不是Object的子类。

答案越长,在您的mqueue.removeAll(Collections.singleton(null))电话中,您就会遇到类型推断。编译器正在尝试将Collections.singleton(null)的类型签名与mqueue.removeAll()参数进行匹配,并且它失败了。编译器认为Collections.singleton(null)正在返回一个Set,因为它不知道还有什么与'null'有关 - 你唯一能说的就是它是一个对象。所以它告诉你,你不能给removeAll(...)一个Set参数,因为该方法被定义为接受一个Collection。 Set是一个集合,但是Object与T不匹配。

要为编译器提供足够的信息,您需要为其提供类型提示 - Collections.<T>singleton(null)

答案 2 :(得分:0)

<T>应该是一个有效的java对象,你需要创建一个实现Operation的类,并用实现Operation的类替换T,例如

public class StandardOperation implements Operation{
    ............}

使用此课程进行操作。记住Java中的每个类都是一个Object。