Поэтому я пытаюсь добавить несколько строк в список с двойной привязкой, но я продолжаю получать ошибку, которую String не может преобразовать в PubliclyCloneable (интерфейс, расширяющий Cloneable, используется для создания клонирования() и конструктора копирования, a la мое объяснение учебника). Вот как выглядит мой демо-код:
public static void main(String[] args)
{
DoublyLinkedList list1 = new DoublyLinkedList();
DoublyLinkedList.DoublyLinkedIterator i = list1.iterator();
String pittsburgh1 = new String("Penguins");
String pittsburgh2 = new String("Pirates");
String pittsburgh3 = new String("Steelers");
list1.addToStart(pittsburgh1);
list1.addToStart(pittsburgh2);
list1.addToStart(pittsburgh3);
System.out.println("List contains:");
i.restart();
while (i.hasNext())
System.out.println(i.next());
System.out.println("");
Вот начальная часть класса DoublyLinkedList:
public class DoublyLinkedList<T extends PubliclyCloneable> implements PubliclyCloneable
{
private class TwoWayNode<T>
{
private T data;
private TwoWayNode<T> next;
private TwoWayNode<T> prev;
public TwoWayNode()
{
data = null;
next = null;
prev = null;
}
public TwoWayNode(T newData, TwoWayNode<T> prevNode, TwoWayNode<T> nextNode)
{
data = newData;
next = nextNode;
prev = prevNode;
}
}
Вот метод, вызывающий ошибку компилятора:
public void addToStart(T itemData)
{
TwoWayNode<T> newHead = new TwoWayNode(itemData, null, head);
if (head != null)
{
head.prev = newHead;
}
head = newHead;
}
И вот интерфейс, который я использую:
public interface PubliclyCloneable extends Cloneable
{
public Object clone();
}
Таким образом, возможно, что-то, что я здесь не замечаю, но чего я пытаюсь сделать даже возможным? Есть ли какой-то тип или тип присваивания, который я могу сделать, чтобы добавить эти три строки в мой список?
Ваш метод addToStart
принимает аргумент типа T
, где T
определяется классом как T extends PubliclyCloneable
.
Поскольку java.lang.String
не реализует PubliclyCloneable
, он не может быть типом аргумента для вашего DoublyLinkedList
. Если вы хотите, чтобы main
функция проверяла ваш класс, я бы выполнил простой-тупой класс PubliclyClonableString
::
public class PubliclyClonableString implements PubliclyClonable {
private String s;
public PubliclyClonableString (String s) {
this.s = s;
}
@Override
public String clone() {
return s; // OK, since Strings are immutable
}
// getter, setter, etc.
}
Вы пытаетесь добавить Strings в список, который, как вы заявили, будет содержать PubliclyCloneable. Либо поставьте в него объекты PubliclyCloneable, либо объявите, что они будут содержать строки.
Поскольку DoublyLinkedList
требует класс, который расширяет PubliclyCloneable
, вам придется создать свой собственный класс строк:
public class CloneableString implements PubliclyCloneable {
private String str;
public CloneableString(String str) {
this.str = str;
}
public String getString() {
return str;
}
@Override
public Object clone();
return new CloneableString(str);
}
}