Страницы

Поиск по вопросам

пятница, 31 января 2020 г.

Ошибка java.lang.ClassCastException: [F cannot be cast to [Ljava.lang.Object / Java

#java


Использую библиотеку с открытым кодом JGraphX (http://www.jgraph.com/) для визуализации
графов. Возникла такая проблема, при попытке экспорта модели в XML-файл возникает ошибка
: java.lang.ClassCastException: [F cannot be cast to [Ljava.lang.Object. Я нашёл место
в коде библиотеки, где эта ошибка  генерится:  

/**
* Encodes the child objects of arrays, maps and collections.
* 
* @param enc Codec that controls the encoding process.
* @param obj Object whose child objects should be encoded.
* @param node XML node that contains the encoded object.
*/

protected void encodeElements(mxCodec enc, Object obj, Node node)
{
    if (obj.getClass().isArray())
    {         
        Object[] tmp = (Object[]) obj; // Здесь всё рушиться

        for (int i = 0; i < tmp.length; i++)
        {
            encodeValue(enc, obj, null, tmp[i], node);
        }
    }
    else if (obj instanceof Map) ...

При трассировке выяснилось, что obj действительно хранит массив из 10 числе типа
Float. Для понимания ситуации, я сделал следующий пример, чтобы разобраться :
public class Encast {

    public static void main(String[] args) {
        Object obj = createMassiv();
        Object[] tmp = (Object[]) obj;
    }

    public static Float[] createMassiv() {
        Float[] obj = new Float[10];
        for(int i = 0; i < obj.length; ++i) {
            obj[i] = (float) (i + 1);
        }
        return obj;
    }
}

В моём примере всё работает и преобразуется. Я не могу понять, в чём проблема в библиотеке,
и как я могу переписать так, чтобы не было ошибки.    


Ответы

Ответ 1



Проблема воспроизведется, если вы будете использовать тип float[] вместо Float[]. В Java массивы коварианты по типу, и т.к. тип Float является производным от Object, то и тип Float[] является производным от Object[]. Но примитивный тип float не является производным от ссылочного типа Object.

Комментариев нет:

Отправить комментарий