ClassCastException 字符串无法转换为自定义 class

ClassCastException String cannot be converted to custom class

这个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;
}
}

问题出在这个方法中:

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;
}

仔细观察,您将 v[i] 的名称写入 temp,然后将 temp 分配给 v[j],所以现在您有 String 而不是 Pairv[j] 中。

如果您为数组使用了正确的类型,即 Pair[],您可以摆脱 ClassCastExceptions。我的意思是如果你将所有 Object[] 换成 Pair[] 你会在编译时看到这种不正确的分配,而不是在运行时。