2015-11-09 5 views
3

Я пытаюсь преобразовать два объекта в целые числа, добавить их, а затем преобразовать их обратно в объекты и сохранить их в массиве объектов. Я, когда я пытаюсь добавить объекты обратно в массив, однако, я получаю исключение Array Store.type casting with objects

Scanner scanner = new Scanner(System.in); 
String str = scanner.nextLine(); 
str = str.replaceAll("[^0-9]+", " "); 
Object[] numbersArray = Arrays.asList(str.trim().split(" ")).toArray(); 
str = scanner.nextLine(); 
str = str.replaceAll("[^0-9]+", " "); 
Object[] translateArray = Arrays.asList(str.trim().split(" ")).toArray(); 

for (int i = 0; i < numbersArray.length; i+=2) { 
    Object x = (Object) (Integer.parseInt(numbersArray[i].toString()) 
        + Integer.parseInt(translateArray[0].toString())); 
    Object y = (Object) (Integer.parseInt(numbersArray[(i+1)].toString()) 
        + Integer.parseInt(translateArray[1].toString())); 

    System.out.println(x.getClass().getName()); //how is this an integer??? 
    System.out.println(y); //values get added correctly... 
    numbersArray[i] = (Object) x; 
    numbersArray[i+1] = (Object) y; 
    } 

Как вы можете видеть, что я пытаюсь бросить тип объекта везде, где я могу, но numbersArray отказывается принять его. Я думаю, что моя проблема имеет какое-то отношение к операторам присваивания объектов x и y. Почему они все еще появляются как целые числа?

+0

Каков результат, которого вы ожидаете? – Perdomoff

ответ

4

numbersArray действительно String[]. Это связано с тем, что String.split() возвращает String[] и Arrays.asList(array).toArray() работает, просто вызывая clone() на обернутом массиве.

В результате при попытке сохранить Integer в String[] вы получаете ArrayStoreException.

Если вы хотите получить истинное Object[] вы можете сделать

List<String> list = Arrays.asList(str.trim().split(" ")); 
Object[] numbersArray = list.toArray(new Object[list.size()]); 

Однако я хотел бы рассмотреть вопрос об изменении вашего дизайна. Использование Object[] сначала для хранения String s, а затем Integer s может вызвать путаницу и ошибки.

+1

Настоящим виновником здесь является то, что массивы на Java являются ковариантами. –

+0

Согласен. Если бы я мог вернуться во времени и изменить, что я определенно хотел бы. –

+0

Это может считаться недостатком API. 'List.toArray()' должен возвращать 'Object []' (а не подтип), иначе нет способа, как утверждает javadoc: «Таким образом, вызывающий пользователь может изменять возвращаемый массив» – ZhongYu

1

, поскольку Павел ответил на ваш главный вопрос, позвольте мне ответить на ваш вопрос к югу

System.out.println (x.getClass() GetName().); // как это целое число ???

, если вы запустите следующий простой код:

Object o = 45; 
System.out.println(o.getClass().getName()); 

это даст вам java.lang.Integer, поскольку ссылка может быть типа Object но фактическое значение является Integer.