Я получаю событие ClassCastException, хотя типы совпадают. Зачем? - PullRequest
3 голосов
/ 05 декабря 2011

Я не слишком новичок в Java, хотя раньше никогда не работал с Set s, так может кто-нибудь помочь мне здесь?

У меня следующая проблема; но прежде всего это мой код:

HashMap<Position[], String> save = io.getSave();

Position[][] saved_pos = (Position[][]) save.keySet().toArray();

Хотя во второй строке Java выдает ClassCastException, но почему? Очевидно, что массив, возвращаемый save.keySet().toArray(), содержит Position[][] с, хотя, к сожалению, toArray() в классе Set возвращает только массив Object[].

Так что я могу сделать, мне нужно разыграть это.

Ответы [ 4 ]

7 голосов
/ 05 декабря 2011

Метод toArray() на самом деле не знает, что он вызывается для набора Position[] с;все, что он знает, это то, что его вызывают на съемочной площадке(Это из-за того, как дженерики реализованы в Java; во время выполнения доступно не так много информации.) Таким образом, он просто возвращает Object[] полный Partition[] с, а не возвращает истинное Partition[][].(Разница в том, что Object[] может содержать произвольные объекты - после вашего вызова будет правильно написать saved_pos[0] = new Object() - тогда как истинное Partition[][] вызовет ArrayStoreException, если вы попытаетесьустановить один из его элементов на new Object().)

К счастью, есть отдельный метод toArray(...), который можно использовать, где вы сообщаете , какой тип массива вы хотите, например, так:

Position[][] saved_pos = save.keySet().toArray(new Position[0][]);
0 голосов
/ 05 декабря 2011

По умолчанию toArray просто возвращает вам объект, а не Position, вам нужно будет передать тип объекта, который вы хотите toArray, чтобы вернуть вас,

Ваш код будет изменен как

save.keySet().toArray(new Position[][]{}); // Yes a blank Position[][] will do
0 голосов
/ 05 декабря 2011
Position[][] saved_pos = save.keySet().toArray(new Position[0][])

Это нужно вам, потому что Java не может привести Object[][] к Position[][].

0 голосов
/ 05 декабря 2011

Вам нужно

    Set<Position[]> positions = save.keySet();
    Position[][] saved_pos = positions.toArray(new Position[positions.size()][]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...