首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >泛型浅拷贝

泛型浅拷贝
EN

Stack Overflow用户
提问于 2013-08-27 12:33:45
回答 1查看 1K关注 0票数 0

我想编写一个泛型类,它是一个具有基本Push和Pop操作的先入先出队列,下面是类:

代码语言:javascript
复制
class queue<E>
{
protected final class elem
{
    public E val;
    public elem next=null;
    public elem(){}
    public elem(E v)
    {
        val=v;
    }
}
protected elem head=null,tail=null;
public queue()
{
}
public queue(E v)
{
    head=new elem(v);
}
public void push(E v)
{
    if(head==null)
        head=tail=new elem(v);
    else if(head==tail)
    {
        tail=new elem(v);
        head.next=tail;
    }
    else
    {
        elem t=new elem(v);
        tail.next=t;
        tail=t;
        t=null;
    }
}
public final E peek()
{
    return ((tail!=null)?tail.val:null);
}
public E pop()
{
    if(head==null)
        return null;
    E i=head.val;
    if(head!=tail)
        head=head.next;
    else
        head=tail=null;
    return i;
}
}

问题在于这里的elem构造函数:

代码语言:javascript
复制
public elem(E v)
{
   val=v;
}

我不想把v分配给val,但是我想克隆它(浅拷贝)。

在这里,我尝试过:

1-克隆方法:因为它在对象类中是受保护的,所以我不能从E变量访问它。

2- queue<E extends Cloneable>:没有解决问题,实际上Cloneable是一个空接口,它没有添加任何方法。

3-使用优先级队列的:这可能比自己编写队列类更容易,但我不想要优先级,只是Fifo结构。

4-实现队列接口的:在这个接口中,您必须实现大多数我不需要的方法,而且我仍然必须自己克隆。

那么,接下来该做什么呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-27 12:40:07

您可以创建接口CustomCloneable

代码语言:javascript
复制
interface CustomCloneable {
    public CustomCloneable clone();
}

并在你的情况下使用它。请注意,您必须为您的类提供克隆实现,或者使用下面描述的方法/库。

代码语言:javascript
复制
class Queue<E extends CustomCloneable>

之后,您可以在您的

代码语言:javascript
复制
public Elem(E v) {
    val = (E) v.clone();
}

另一方面,,你可能在找别的东西。请参阅这里用于其他选项,以及为什么要避免克隆。

而不是使用其他一些选项,比如apache-commons SerializationUtils (深度克隆)或BeanUtils (浅克隆),或者简单地使用复制构造函数。

也请阅读java代码约定

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

https://stackoverflow.com/questions/18465566

复制
相关文章

相似问题

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