【问题标题】:ClassCastException String cannot be converted to custom classClassCastException 字符串无法转换为自定义类
【发布时间】:2016-02-06 11:33:02
【问题描述】:

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

【问题讨论】:

  • 你的插入函数在哪里?
  • 我找到了一种方法来解决这个问题,只需创建一个 Pair[] 数组而不是 Object[] 但我仍然不明白为什么这不起作用。
  • 这是我的主要内容,我创建了 Rubrica r = new Rubrica();并调用 r.insert(key, value)

标签: java string dictionary classcastexception


【解决方案1】:

问题出在这个方法上:

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],所以现在您在v[j] 中有String 而不是Pair

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

【讨论】:

  • 非常感谢,我创建了一个 tempObj = v[i] 并将它分配给它 v[j] 给 tempObj,它应该可以正常工作。我在考试中犯了同样的错误,我很高兴现在解决了它:)。发布后,我尝试将数组 Object 切换为 Pair 数组,就像你说的那样。
  • 您能否给我进一步的解释:“它在我看来这个算法无论如何都被破坏了”?我认为创建一个对象数组然后将它们分配给 Pair 以更“通用”是正确的
  • @LucaAttanasio 我的意思是insertionSort的算法,但现在我理解它是正确的,所以没关系并使用适当的类型:)
猜你喜欢
  • 1970-01-01
  • 2018-08-12
  • 1970-01-01
  • 2019-11-22
  • 1970-01-01
  • 1970-01-01
  • 2017-11-27
  • 2023-03-11
  • 2020-03-17
相关资源
最近更新 更多