这ClassCastException
让我发疯。
调用方法insert()
时,我得到了这个:
Exception in thread "main" java.lang.ClassCastException:
java.lang.String cannot be cast to Rubrica$Pair
希望任何人都可以帮助而不会浪费太多时间:)。
class Rubrica implements Dictionary
{
private Object[] v;
private int vSize;
public static int INITSIZE = 1;
/*
verifica se il dizionario contiene almeno una coppia chiave/valore
*/
public Rubrica()
{
v = new Object[INITSIZE];
makeEmpty();
}
private Object[] resize(Object[] v, int length)
{
Object[] newv = new Object[length * 2];
System.arraycopy(v, 0, newv, 0, length);
return newv;
}
/*
svuota il dizionario
*/
public void makeEmpty()
{
for(int i = 0; i < v.length; i++)
v[i] = new Pair(null, -1);
vSize = 0;
}
/*
Inserisce un elemento nel dizionario. L'inserimento va sempre a buon fine.
Se la chiave non esiste la coppia key/value viene aggiunta al dizionario;
se la chiave esiste gia' il valore ad essa associato viene sovrascritto
con il nuovo valore; se key e` null viene lanciata IllegalArgumentException
*/
private Object[] insertionSort(Object[] v, int vSize)
{
for(int i = 0; i < vSize; i++)
{
Comparable temp = ((Pair)v[i]).getName();
int j;
for(j = i; j > 0 && temp.compareTo(((Pair)v[j - 1]).getName()) < 0; j--)
v[j] = v[j - 1];
v[j] = temp;
}
return v;
}
public void insert(Comparable key, Object value)
{
if(vSize == v.length)
v = resize(v, vSize);
if(key.equals(null))
throw new IllegalArgumentException();
int index = binaryKeyIndexSearch(v, vSize, key);
if(index == -1)
v[vSize++] = new Pair((String)key, (long)value);
else
v[index] = new Pair((String) key, (long)value);
v = insertionSort(v, vSize);
}
/*
Cerca nel dizionario l'elemento specificato dalla chiave key
La ricerca per chiave restituisce soltanto il valore ad essa associato
Se la chiave non esiste viene lanciata DictionaryItemNotFoundException
*/
private int binaryKeyIndexSearch(Object[] v, int vSize, Comparable value)
{
return binKeySearch(v, 0, vSize - 1, value);
}
private int binKeySearch(Object[] v, int from, int to, Comparable value)
{
if(from > to)
return -1;
int mid = (from + to) / 2;
Comparable midValue = ((Pair)v[mid]).getName(); //errore
if(value.compareTo(midValue) == 0)
return mid;
else if(value.compareTo(midValue) < 0)
return binKeySearch(v, from, mid - 1, value);
else
return binKeySearch(v, mid + 1, to, value);
}
//classe privata Pair: DO NOT MODIFY!!
private class Pair
{ public Pair(String aName, long aPhone)
{ name= aName;
phone = aPhone;
}
public String getName()
{ return name; }
public long getPhone()
{ return phone; }
/*
Restituisce una stringa contenente
- la nome, "name"
- un carattere di separazione ( : )
- il numero telefonico, "phone"
*/
public String toString()
{ return name + " : " + phone; }
//campi di esemplare
private String name;
private long phone;
}
}
答案 0 :(得分:0)
问题出在这个方法中:
private Object[] insertionSort(Object[] v, int vSize)
{
for(int i = 0; i < vSize; i++)
{
Comparable temp = ((Pair)v[i]).getName();
int j;
for(j = i; j > 0 && temp.compareTo(((Pair)v[j - 1]).getName()) < 0; j--)
v[j] = v[j - 1];
v[j] = temp;
}
return v;
}
仔细观察,您将temp
的名称写为v[i]
,然后将temp
分配给v[j]
,这样您就可以String
代替Pair
在v[j]
中。
如果您使用了正确的数组类型Pair[]
,则可以删除ClassCastExceptions。我的意思是如果你将所有Object[]
交换到Pair[]
,你会在编译时看到这种错误的赋值,而不是在运行时。