【问题标题】:'List<T>' may not contain type objects of type 'Object'“List<T>”可能不包含“Object”类型的对象
【发布时间】:2015-12-13 20:10:34
【问题描述】:


这可能有一个不是Object 的子类的类吗?

长:
我正在使用包含接口实现的List&lt;T&gt; (Operation):

public class OperationQueue<T extends Operation> {

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

当我在循环中遍历这个列表时,我将每个完成的操作标记为空,因为我必须保持相同的大小并且我不能使用迭代器(它会抛出 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&lt;T&gt;' may not contain type objects of type 'Object'

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

任何帮助将不胜感激。

【问题讨论】:

    标签: java android collections


    【解决方案1】:

    一切都是 Object 的子元素:但您的 List 需要它们是 Object 子元素的特定类型,即:T 类型。

    Collections.singleton(null) 不是 Ts 的集合。试试Collections.&lt;T&gt;singleton(null);通过将说明符添加到方法调用中,您可以返回指定类型的集合。

    【讨论】:

    • 嗯,真的,没有警告了。谢谢!
    【解决方案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.&lt;T&gt;singleton(null)

    【讨论】:

    • 对不起,我愿意接受,你也愿意,但他是第一个。感谢您的回答!
    【解决方案3】:

    &lt;T&gt;应该是一个合法的java对象,你需要创建一个实现Operation的类,并将T替换成实现Operation的类例如

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

    使用这个类来做你的操作。请记住,Java 中的每个类都是一个对象。

    【讨论】:

    • 我明白这一点,我的问题是关于另一件事:)
    猜你喜欢
    • 2017-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-10
    • 1970-01-01
    • 2014-01-04
    • 2022-11-02
    • 2010-11-10
    相关资源
    最近更新 更多