我正在实现自定义对象的优先级队列。自定义对象类如下所示,
是否建议将其实现为泛型类,其中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>
的代码。