首先,我会说我是 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:几乎可读啊!