当队列类型包含通用类型时阻塞队列

问题描述:

我有一个类型MyType<T>,它包含一个通用类型T。我有一个BlockingQueue<MyType<T>>类型的阻塞队列。我想发送“流尾”标记到队列中,即毒丸,但问题是我不能实例化毒丸,因为它是通用类型的。有没有解决的办法?当队列类型包含通用类型时阻塞队列

您应该可以创建一个。

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构造函数。

+0

这并不工作,因为对构造函数没有保证。另外,在MyType的每个实例中存储一个空对象效率不高。 – Max

+0

@Max - 我注意到我的不是'静态' - 修正了这个问题。更好? – OldCurmudgeon

没有看到您的代码,很难找到正确的解决方案。我能想到的是:

  • 将一种方法添加到MyType,表明这是毒丸。

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

您仍然可以创建通用对象并进行投射。例如看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; 
} 

只要确保最终的流标记处理不使用/取决于