0

我想编写一个通用类,它是具有基本推送和弹出操作的先进先出队列,这里是类:

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 构造函数中:

public elem(E v)
{
   val=v;
}

我不想将 v 分配给 val 但我想克隆它(浅拷贝)。
这是我尝试过的事情:
1-克隆方法:因为它在 Object 类中受到保护,所以我无法从 E 变量访问它。

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

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

4-实现队列接口:其中你必须实现许多我不需要的方法,而且我仍然需要自己克隆。

那么,接下来要尝试什么?

4

1 回答 1

1

您可以创建界面CustomCloneable

interface CustomCloneable {
    public CustomCloneable clone();
}

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

class Queue<E extends CustomCloneable>

之后你可以调用clone你的方法

public Elem(E v) {
    val = (E) v.clone();
}

另一方面,您可能正在寻找其他东西。请参阅此处了解其他选项以及为什么应避免克隆。

取而代之的是使用其他一些选项,例如 apache-commons [ SerializationUtils][1] (deep-clone) 或BeanUtils(shallow-clone),或者简单地使用复制构造函数。

另请阅读java 代码约定

于 2013-08-27T12:40:07.830 回答