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