如何让 BlockingQueue 接受多种类型?

How to make BlockingQueue to accept multiple types?

我有 class X、class Y 和 class Z。如果XY执行特定条件,则应将它们放入BlockingQueue。 Class Z 直接从队列中取出。

我知道创建这样的东西:

BlockingQueue<X,Y> BQueue=new ArrayBlockingQueue<X,Y>(length);

是非法的。如何正确制作?

最简单的方法是让 BlockingQueue 接受任何对象类型:

BlockingQueue<Object> q = new ArrayBlockingQueue<>(length);

然后,在 take() 操作中,您只需查看特定的 class 对象是什么:

Object o = q.take();
if (o instanceof X) {
    X x = (X) o;
    // do work with x
} else if (o instanceof Y) {
    Y y = (Y) o;
    // do work with y
} else {
    // o is neither X nor Y
}

如果 XY 继承自通用 class 或实现通用接口,请使您的队列更具体:

BlockingQueue<XYInterface> q = new ArrayBlockingQueue<>(length);

你可以按照 Sasha 的建议使用 BlockingQueue<Object>,但我更喜欢将通用功能声明到接口中,然后让每个 class 处理它自己的功能,而不是使用 instanceof声明:

public interface Common {

    boolean shouldEnqueue();

    void doSomething();

}

public class X implements Common {

    public boolean shouldEnqueue() {
        ...
    }

    public void doSomething() {
        System.out.println("This is X");
    }
}

public class Y implements Common {

    public boolean shouldEnqueue() {
        ...
    }

    public void doSomething() {
        System.out.println("This is Y");
    }
}

public class Producer {

    private final BlockingQueue<Common> queue;

    void maybeEnqueue(Common c) {
        if(c.shouldEnqueue()) {
            queue.add(c);
        }
    }
}

public class Consumer {
    private final BlockingQueue<Common> queue;

    void doSomething() {
        queue.take().doSomething();
    }
}