org.apache.commons.collections.buffer包中的Java类CircularFifoBuffer是非泛型的,可以存储任何类的对象。
我想创建一个泛化的版本,它只能容纳T类的对象。我的第一个想法是扩展CircularFifoBuffer,简单地写一个新的'add‘方法:
public class CircularFifoQueue<T> extends CircularFifoBuffer {
public boolean add(T data) {
return super.add(data);
}
}但是,这保留了旧的'add‘方法,允许添加任意类的对象。有没有办法避免这个问题,使用继承而不是组合(这样我就不必重新实现CircularFifoBuffer的所有方法),但可以防止类的用户添加非T对象?
发布于 2011-05-19 19:37:49
一种想法是不要实现自己的缓冲区,它只包装了原始的缓冲区:
public class CircularFifoQueue<T> {
private CircularFifoBuffer buffer = new CircularFifoBuffer();
public boolean add(T data) {
return buffer.add(data);
}
// implement all other methods that are needed
}因此,内部缓冲区接受所有内容,但包装器确保只能添加T类型的对象。问题:目前,buffer没有实现任何接口。所以它的使用现在有点有限(例如,如果你需要发送一个Buffer,你就不能使用它)
发布于 2011-05-19 19:22:28
不,你不能。
这不可能的简单原因是多态。如果可以删除add(Object)方法,就会破坏CircularFifoBuffer类的多态性。
这里有一个简单的例子。要使其正常工作,您的CircularFifoQueue类需要有一个add(Object)方法。
CircularFifoBuffer buffer = new CircularFifoQueue<String>();
buffer.add(new Object());发布于 2011-05-19 19:28:50
@Vivien的回答已经解释了为什么这样做没有实际意义(更多信息,请阅读关于的信息)。
但是,您可以通过定义一个自定义的add(Object)覆盖来解决这个问题,它只是在运行时抛出一个异常。这不是一个非常优雅的解决方案,但如果您想要快速修复,那么这可能是它。
https://stackoverflow.com/questions/6057826
复制相似问题