Начну с того, что я новичок в Java (/программировании), и это мой первый вопрос на сайте.
Только что узнал, как сделать упорядоченный список в Java, используя рекурсивные узлы. Все было просто, пока я не столкнулся с этим упражнением, в котором меня попросили написать метод, который удваивал бы любое значение, содержащееся в каждом узле. Вот код, который я пытался написать:
public class ListaInteri<E extends Integer>
{
private NodoLista inizio;
// Private inner class each instance of these has a raw type variable and a
// ref
// to next node in the list
private class NodoLista
{
E dato;
NodoLista pros;
}
// method that adds whatever is meant by x to the begging of the list
public void aggiungi(E x)
{
NodoLista nodo = new NodoLista();
nodo.dato = x;
if (inizio != null)
nodo.pros = inizio;
inizio = nodo;
}
// a method that switches last and first elements in the list
public void scambia()
{
E datoFine;
if (inizio != null && inizio.pros != null) {
E datoInizio = inizio.dato;
NodoLista nl = inizio;
while (nl.pros != null)
nl = nl.pros;
datoFine = nl.dato;
inizio.dato = datoFine;
nl.dato = datoInizio;
}
}
// and here is the problem
// this method is supposed to double the value of the raw type variable dato
// of each node
public void raddoppia()
{
if (inizio != null) {
NodoLista temp = inizio;
while (temp != null) {
temp.dato *= 2;
}
}
}
// Overriding toString from object (ignore this)
public String toString(String separatore)
{
String stringa = "";
if (inizio != null) {
stringa += inizio.dato.toString();
for (NodoLista nl = inizio.pros; nl != null; nl = nl.pros) {
stringa += separatore + nl.dato.toString();
}
}
return stringa;
}
public String toString()
{
return this.toString(" ");
}
}
и вот какую ошибку мне выдает компилятор.
ListaInteri.java:39: inconvertible types
found : int
required: E
temp.dato*=2;
^
1 error
Теперь имейте в виду, что любая помощь будет очень признательна в любом случае, вот вопросы, на которые я хотел бы получить ответ.
- Почему это происходит? Разве не существует такой вещи, как стирание необработанных типов во время компиляции, когда вся информация, имеющая отношение к типам параметров или аргументов, игнорируется?
- Как это исправить? Второй метод (тот, который переключается первым и последним) показывает, что на самом деле компилятор может изменять поля в узлах, если он передается другим необработанным типом, а если мы попытаемся умножить его, например, на 2, это больше не нормально. потому что теперь компилятор знает, что мы говорим о int/Integer, поэтому возвращает эту ошибку. Заранее спасибо за любые ответы.
РЕДАКТИРОВАТЬ; извините, пришлось сделать его читаемым, теперь все в порядке. EDIT2: почти читаемо аргх!