当队列类型包含泛型时,使用阻塞队列

时间:2015-07-13 13:19:50

标签: java

我的类型MyType<T>包含通用类型T。我有一个BlockingQueue<MyType<T>>类型的阻塞队列。我想发送&#34; end-of-stream&#34;队列中的标记,即毒丸,但问题是由于泛型类型,我无法实例化毒丸。有办法解决这个问题吗?

3 个答案:

答案 0 :(得分:2)

你应该能够创建一个。

class MyType<T> {


    private BlockingQueue<MyType<T>> q = new ArrayBlockingQueue<>(10);
    // Poison pill to signal the end of the queue.
    public static final MyType<?> PILL = new MyType<>();

    /**
     * Special private constructor for PILL creation.
     */
    private MyType() {

    }

    public boolean queueClosed() {
        return q.peek() == PILL;
    }
}

如果你有自己的构造函数,你可以添加一个没有参数的private构造函数。

答案 1 :(得分:1)

您仍然可以创建通用对象并将其强制转换。例如,查看java.util.Collections.emptyList():

@SuppressWarnings("unchecked")
public static final List EMPTY_LIST = new EmptyList<Object>();

@SuppressWarnings("unchecked")
public static final <T> List<T>  emptyList() {
    return (List<T>) EMPTY_LIST;
}

只需确保流末尾标记处理不使用/依赖

答案 2 :(得分:0)

如果没有看到您的代码,很难找到合适的解决方案。我能想到的是:

  • MyType添加一个方法,表明这是毒丸。

  • 创建一个空的PoisonPill标记界面,并向getPoison()添加MyType静态方法,返回MyType implements PoisonPill,然后使用instanceof进行测试