【问题标题】:java.lang.ClassCastException: Creating a synchronized Linked Listjava.lang.ClassCastException:创建一个同步的链表
【发布时间】:2013-10-22 06:18:14
【问题描述】:

我想要一个带有通用 A 类的同步 LinkedList,这里是相关部分:

public abstract class A<T extends B> implements Runnable {

B 的接口,“真正的”B,将是一个子类

public interface B{

以下设置将引发运行时错误:

LinkedList<A<? extends B>> eopList = (LinkedList<A<? extends B>>) Collections
            .synchronizedCollection(new LinkedList<A<? extends B>>());

我找到了以下建议,但它也不会编译:

LinkedList<A<? extends B>> eopList = (LinkedList) Collections
            .synchronizedCollection(new LinkedList<A<? extends B>>());

这是日志:

Exception in thread "main" java.lang.ClassCastException: java.util.Collections$SynchronizedCollection cannot be cast to java.util.LinkedList

【问题讨论】:

标签: java generics linked-list synchronized classcastexception


【解决方案1】:

改用Collections.synchronizedList() 方法。该方法返回一个List&lt;T&gt;。因此,将 LHS 上的类型设为 List,以避免类型转换:

List<A<? extends B>> eopList = Collections.synchronizedList(new LinkedList<A<? extends B>>());

【讨论】:

    【解决方案2】:

    nosIs LinkedList thread-safe when I'm accessing it with offer and poll exclusively?的话来说:

    LinkedList 不是线程安全的。您必须自己进行锁定。

    尝试ConcurrentLinkedQueueLinkedBlockingDeque 它符合您的需求

    或者试试Piyush Harianswer的代码:

      LinkedList<A<? extends B>> eopList = (LinkedList)Collections.synchronizedList(new LinkedList<A<? extends B>());
    

    【讨论】:

    • -1 这只是重复了 OP 所犯的相同错误 - synchronizedList 返回的 List 包装了 LinkedList,但它本身不是 LinkedList
    猜你喜欢
    • 2016-04-02
    • 2020-09-18
    • 1970-01-01
    • 2023-03-22
    • 2012-03-04
    • 1970-01-01
    • 2020-04-22
    • 1970-01-01
    相关资源
    最近更新 更多