java - 泛型类型的浅拷贝

标签 java generics shallow-copy

我想编写一个通用类,它是一个先进先出队列,具有基本的 Push 和 Pop 操作,下面是该类:

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 类中 protected ,所以我无法从 E 变量访问它。

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

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

4-实现队列接口(interface):其中必须实现很多方法,其中大部分我不需要,而且我仍然需要自己克隆。

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

最佳答案

您可以创建接口(interface)CustomCloneable:

interface CustomCloneable {
    public CustomCloneable clone();
}

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

class Queue<E extends CustomCloneable>

之后,您可以在您的

上调用 clone 方法
public Elem(E v) {
    val = (E) v.clone();
}

另一方面您可能正在寻找其他东西。 Refer here了解其他选项以及为什么应避免克隆。

Instead of that use some other options, like apache-commons [SerializationUtils][1] (deep-clone) or BeanUtils (shallow-clone), or simply use a copy-constructor.

另请阅读java code conventions

关于java - 泛型类型的浅拷贝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18465566/

相关文章:

java - 如何配置 mvc :annotation-driven 使用的 Jaxb2Marshaller

java - 什么是浅拷贝?

java - Spring Boot新建项目时pom.xml报错

java - 加载时从 jsp 调用不返回任何内容的 servlet

java - 方法 getLogger() 不再是 log4j2 中 Logger 的成员?

c# - 我知道 typeof(T) 但编译器不知道。怎么修?

对任意类型进行快速排序

c# - 如何使表达式将值类型视为引用类型?

javascript - 从浅复制对象中删除属性

c# - 在 C# 中创建结构的浅拷贝