2012-06-05 2 views
-2

У меня есть экзамен, который я изучаю для .. и я думал об элегантном способе ответить на следующий вопрос, мой текущий ответ был бы чем-то вроде (на основе информации из этого answer на stackoverflow)Теория: объявление списка Список объектов = новый ArrayList();

Вышеупомянутая инициализация невозможна, она будет компилироваться, но в объявлении отсутствует идентификатор, а другие функции, такие как add, remove, будут недоступны.

вопрос ..

Рассмотрим следующий фрагмент кода. Можно ли назначить экземпляр ArrayList переменной, объявленной как Object, как это сделано в строке 1? Объясните.

Object strings = new ArrayList(); 

    strings.toString(); 

Какие другие способы ответить на этот вопрос? и не могли бы вы предоставить википедию/ресурсы, чтобы я мог продолжить изучение того, как компилятор переведет это в байт-код? Спасибо

+2

Вместо того чтобы размещать изображение кода, просто отправьте код. – Jeffrey

+1

BTW, он компилирует: http://ideone.com/3NAbz – Naveen

+1

Кажется, очень простой вопрос (особенно при изучении для экзамена), чтобы увидеть, компилирует ли код, прежде чем категорически заявить, что это не так. –

ответ

2

Рассмотрите следующий фрагмент кода. Можно ли назначить экземпляр ArrayList переменной, объявленной как Object, как это сделано в строке 1? Объясните.

Object strings = new ArrayList(); 

    strings.toString(); 

Да, это возможно. Object - это супер тип ArrayList (на самом деле, Object - это супер тип всех ссылочных типов Java). Законодательно объявлять переменную типа супер-типа присвоенного фактического типа.

Аналогичная ситуация возникает при определении List с конкретной реализацией ArrayList:

List<String> list = new ArrayList<String>(); 
+0

Спасибо! :-) Я собираюсь сделать еще несколько исследований по супер-типам. : P – Killrawr

+0

Я бы немного изменил ответ: * «на самом деле, Object - это супер тип всех ссылочных типов Java ** ** *.Придирчивый экзаменатор может сказать, что массивы не являются классами ... которые могут быть или не быть правдой, в зависимости от используемой вами терминологии. Использование официального слова Java «ссылочный тип» устраняет любые возможные каламбуры. –

1

Это компилировать (? Пробовали ли вы его), но в результате ArrayList трудно использовать, поскольку он объявлен быть Объектом. Например, строка:

strings.add("hello"); 

не компилируется потому, что добавление() не определено для типа объекта. Однако

((List)strings).add("hello"); 

это скомпилировано.

+0

Спасибо, да, я протестировал его на компиляции на затмении, но у меня было некоторое исследование из [здесь] (http://stackoverflow.com/questions/2516778/java-how-to-have-an-arraylist-as-instance -переменная-объекта-объекта) и на основе этого вопроса. Я думал, что это скомпилируется, спасибо за разъяснение. – Killrawr

+1

@Killrawr: ссылка использует общие файлы (бит внутри < >), но не имеет объявленного имени переменной. Взгляните на последний блок кода в моем ответе, чтобы увидеть правильный пример генериков. (В исходном вопросе не использовались дженерики в примере кода). –

+0

@GregKopff ohh хорошая точка. Я думал, что определяю списки строк или типов данных вместо списков объектов. Было бы хорошо, потому что объекты, извлеченные из списков, не должны быть лишены. – Killrawr

Смежные вопросы