首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将非泛型类扩展为泛型类

将非泛型类扩展为泛型类
EN

Stack Overflow用户
提问于 2011-05-19 19:19:48
回答 4查看 3.9K关注 0票数 2

org.apache.commons.collections.buffer包中的Java类CircularFifoBuffer是非泛型的,可以存储任何类的对象。

我想创建一个泛化的版本,它只能容纳T类的对象。我的第一个想法是扩展CircularFifoBuffer,简单地写一个新的'add‘方法:

代码语言:javascript
复制
public class CircularFifoQueue<T> extends CircularFifoBuffer {

    public boolean add(T data) {
        return super.add(data);
    }    

}

但是,这保留了旧的'add‘方法,允许添加任意类的对象。有没有办法避免这个问题,使用继承而不是组合(这样我就不必重新实现CircularFifoBuffer的所有方法),但可以防止类的用户添加非T对象?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-05-19 19:37:49

一种想法是不要实现自己的缓冲区,它只包装了原始的缓冲区:

代码语言:javascript
复制
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,你就不能使用它)

票数 3
EN

Stack Overflow用户

发布于 2011-05-19 19:22:28

不,你不能。

这不可能的简单原因是多态。如果可以删除add(Object)方法,就会破坏CircularFifoBuffer类的多态性。

这里有一个简单的例子。要使其正常工作,您的CircularFifoQueue类需要有一个add(Object)方法。

代码语言:javascript
复制
CircularFifoBuffer buffer = new CircularFifoQueue<String>();
buffer.add(new Object());
票数 3
EN

Stack Overflow用户

发布于 2011-05-19 19:28:50

@Vivien的回答已经解释了为什么这样做没有实际意义(更多信息,请阅读关于的信息)。

但是,您可以通过定义一个自定义的add(Object)覆盖来解决这个问题,它只是在运行时抛出一个异常。这不是一个非常优雅的解决方案,但如果您想要快速修复,那么这可能是它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6057826

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档