2013-08-27 5 views
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; 
} 
} 

Проблема заключается в эль конструктор здесь:

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

Я не хочу, чтобы назначить ст ВАЛ, но я хочу, чтобы клонировать его (мелкую копию).
вот что я пробовал:
1- метод clone: ​​ну, поскольку он защищен в классе Object, я не могу получить к нему доступ из переменной E.

2-queue<E extends Cloneable>: не удалось решить проблему, на самом деле Cloneable - это пустой интерфейс, он не добавляет никаких методов.

3- Использование приоритета: это может быть проще, чем писать класс очереди самостоятельно, но я не хочу приоритета, а только структуру Fifo.

реализация интерфейса очереди: в котором вы должны реализовать множество методов, которые большинство из них мне не нужны, также я все же должен клонировать сам.

Итак, что попробовать дальше?

+0

@Tala спасибо, это первый раз, я отправляю код. – niceman

+0

Мета-комментарий: это не будет легко сделать, потому что это не идиоматическая Java, чтобы сделать копию в такой ситуации. Почему вы хотите получить копию в первую очередь, а не просто хранить предоставленную ссылку? – jacobm

+0

Сохранение ссылки может открыть объект, привязанный к нему для изменения, и я не хочу этого. – niceman

ответ

1

Вы можете создать интерфейс CustomCloneable:

interface CustomCloneable { 
    public CustomCloneable clone(); 
} 

И использовать его в вашей ситуации. Обратите внимание, что вам необходимо предоставить реализацию клонирования для ваших классов или использовать методы/библиотеки, описанные ниже.

class Queue<E extends CustomCloneable> 

И после этого вы можете вызвать clone метод на вашем

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

С другой стороны вы могли бы искать STH еще. Refer here для других вариантов и почему вы должны избегать клонирования.

Вместо того, чтобы использовать некоторые другие параметры, такие как Apache-достоянию [SerializationUtils] [1] (глубоко клон) или BeanUtils (мелкой клон), или просто использовать копию-конструктор.

Также почитайте java code conventions

+0

Я не могу найти метод клонирования даже после этого изменения, я что-то упустил? – niceman

+0

Этот метод объявлен в классе Object. См. Пример: http://www.tutorialspoint.com/java/lang/object_clone.htm http://www.javadb.com/how-to-clone-objects http: // javapapers.com/core-java/java-clone-shallow-copy-and-deep-copy/ – Tala

+0

@Tala: 'Object.clone()' защищен. Это означает, что его можно вызвать только в 'E' в' E' или подклассе 'E'. Его нельзя назвать 'E' в« Elem ». – newacct

 Смежные вопросы

  • Нет связанных вопросов^_^