我正在实现自定义对象的优先级队列。自定义对象类如下所示,
是否建议将其实现为泛型类,其中T仅仅是与messageId相关联的有效负载?

public class PriQMsgPayload <T> implements Comparable<PriQMsgPayload<T>>{


    private Integer mMsgNum;
    private T ExtraDataForMsg = null;

    public PriQMsgPayload(T extra, PluginConfig.PriQMessage msg)
    {
        mMsgNum= msg;
        ExtraDataForMsg = extra;
    }

    @Override
    public int compareTo(PriQMsgPayload<T> another) {
        return mMsgNum.compareTo(another.mMsgNum);
    }
}


我的疑问:在下面提到的情况下,我首先插入专用于Integer的P1,而当我插入另一个专用于MyClass的对象P2时,比较器不会混淆吗?

PriQMsgPayload<Integer> P1 = new PriQMsgPayload<Integer>(2, 1);
PriQMsgPayload<MyClass> P2 = new PriQMsgPayload<MyClass>(new MyClass(), 2);

最佳答案

我认为没有任何意义。当您尝试将对象放入队列时,问题就来了-队列没有可以完全容纳的类型,可以同时包含这两个对象!

考虑:

PriorityQueue queue; // works, but is raw
PriorityQueue<PriQMsgPayload> queue; // works, but is partially raw
PriorityQueue<PriQMsgPayload<Object>> queue; // won't accept either object


您可以将它们放入这种类型的队列中(我最初说不能,但是@newacct可以纠正我):

PriorityQueue<PriQMsgPayload<?>> queue; // won't accept either object


但这涉及丢弃有关您拥有什么样的额外数据的类型信息。

允许您添加两个对象的所有队列类型都不会保留额外数据的类型。这意味着当您再次取出对象时,您将丢失所有类型信息。无法编写将对象安全提取为PriQMsgPayload<Integer>而不是PriQMsgPayload<MyClass>的代码。

08-03 14:26