gpt4 book ai didi

java - 泛型类型的浅拷贝

转载 作者:行者123 更新时间:2023-12-01 14:11:52 24 4
gpt4 key购买 nike

我想编写一个通用类,它是一个先进先出队列,具有基本的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com