Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Удивитиельная природа ArrayStoreException


Автор: Royan 27.4.2007, 10:58
Вот здесь есть маленький примерчик http://java.sun.com/j2se/1.5.0/docs/api/java/lang/ArrayStoreException.html
Собственно я вообще не понимаю почему там возникает какое-то исключение, когда если написать так

Код

Object s = new String(); 
s = new Integer("2");

никакого исключения нет и в помине.


Автор: kkorsakoff 27.4.2007, 11:44
смотрим пример
Код

     Object x[] = new String[3];
     x[0] = new Integer(0);




Object x[] = new String[3];

Создается массив из String с длиной равной 3.
То что, используется ссылка на него как Object x[] ничего не меняет, фактически массив должен состоять только из строк

 x[0] = new Integer(0);

Попытка положить Integer в этот массив. Вполне логично, что такая попытка должна окончиться неудачей

Автор: Royan 27.4.2007, 18:40
Никакой логики не вижу. Ссылка она и есть ссылка. Java - это не type safe language. Почему должно валиться исключение в случае массива, но не в случае переменной? Не понятно. В общем эта тема к сведенью, поэтому не закрываю. Желающие приводите свои доводы.

Автор: RebornCrusader 28.4.2007, 01:37
Чтобы было понятнее, переименую переменную:
Код

Object o = new String(); // Строка (String) это объект (Object) 
o = new Integer("2"); // Число (Interger) это объект (Object)

Всё логично, мы объявили ссылку наиболее общего типа, соответственно суём туда что угодно. Но с этой ссылкой мы и будем работать как с "просто объектом". Захотим использовать специфику String или Integer (обращаясь к членам или передавая как параметр), должны будем использовать cast.

Теперь массив:

Код

Object x[] = new String[3]; // Массив строк (String[]) это массив объектов (Object[]) 
x[0] = new Integer(0); // x - ссылка на массив объектов, но x[0] - это уже ссылка на элемент, имеющий конкретный тип (String). 
// Естественно, это работать не будет!


Если проводить полную аналогию с переменной, надо писать так:
Код

Object x[] = new String[3]; // Массив строк (String[]) это массив объектов (Object[]) 
x = new Integer[3]; // Массив чисел (Integer[]) это массив объектов (Object[]) 
// Этот код работоспособен!


Нет никакой ложки ;)

Автор: Royan 28.4.2007, 10:56
Цитата
Нет никакой ложки ;)

Позвольте, коллега, вопрос. Cколько типов ссылок в языке Java?

Автор: Kangaroo 28.4.2007, 11:50
Почитай http://mindprod.com/jgloss/gotchas.html#ARRAYSTOREEXCEPTION

Автор: RebornCrusader 28.4.2007, 13:29
Цитата(Royan @  28.4.2007,  18:56 Найти цитируемый пост)
Позвольте, коллега, вопрос. Cколько типов ссылок в языке Java?

Не понял вопроса. Что подразумевается  под словом "тип ссылки"? Если в контексте weak/soft, то это к теме не относится. Если нет... Я употреблял это словосочетание в смысле класса или интерфейса, но с вашим вопросом это никак не вяжется.

Собственно, ссылка, данная Kangaroo, всё хорошо поясняет. Да и ещё кое-что, о чём я не задумывался ;)

Автор: Royan 28.4.2007, 15:36
Прошу прощения за тупеж smile Я наконец-то сообразил, что имеется ввиду и почему вылетает исключение. Я не верно истолковал следующий комментарий уважаемого RebornCrusader'а 
Цитата

 x - ссылка на массив объектов, но x[0] - это уже ссылка на элемент, имеющий конкретный тип (String).


Если навести кристальную чистоту, то ясность проступает в следующем определении.
Ссылки элементов массива объявляются типом, который используется для инициализации объекта массива.

Kangaroo, Приведенная статья как раз не объясняет главного, что типы элементов массива объявляются как переменные с типом эквивалентным тому, что используется для инициализации массива.

RebornCrusader, Я говорил о ссылках в их прямом смысле я ошибочно полагал что, подложенная свинья, именно в них

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)