当队列类型包含通用类型时阻塞队列
问题描述:
我有一个类型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
构造函数。
答
没有看到您的代码,很难找到正确的解决方案。我能想到的是:
将一种方法添加到
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;
}
只要确保最终的流标记处理不使用/取决于
这并不工作,因为对构造函数没有保证。另外,在MyType的每个实例中存储一个空对象效率不高。 – Max
@Max - 我注意到我的不是'静态' - 修正了这个问题。更好? – OldCurmudgeon