2010-09-15 1 views
4

Я изучаю экзамен SCJP, и я столкнулся с проблемой, с которой я не могу обернуть голову.SCJP: не может расшириться, а затем поле, но вы можете вставить поле, а затем увеличить

В книге говорится, что вы не можете расширять, а затем поле, но вы можете вставлять и затем расширять. Примером для невозможности ввода является метод ожидания Long и метод, вызываемый байтом.

Их объяснение:

Подумайте об этом ... если он пытался боксировать первым, байты были бы конвертированы в байты. Теперь мы возвращаемся к , пытаясь расширить байты до длинного и , конечно, тест IS-A терпит неудачу.

Но это звучит как коробка, а затем расширяется и не расширяется, а затем ящик для меня.

Может ли кто-нибудь прояснить всю коробку и расширить, а также увеличить и увеличить размер коробки, потому что, поскольку она стоит, книга не совсем ясна в этом вопросе.

Редактировать: Чтобы уточнить: Я говорю о страницах 252 и 253 сертифицированного SCJP программиста для книги java 6. http://books.google.be/books?id=Eh5NcvegzMkC&pg=PA252#v=onepage&q&f=false

+0

«Но это звучит как коробка, а затем расширяется», вам нужно понять, что в этом примере происходит преобразование 'byte' в' long', поэтому оно является расширенным первым. Это все еще не ясно? –

ответ

0

Это не расширение, потому что байт не вписывается в длинный. Вот почему это не работает.

Вы можете поместить в байт, а затем расширить до Object или Number.

В своей книге говорит:

мы вернулись к пытаясь, чтобы расширить Byte в Лонг


В вашем случае, я полагаю, что код выглядит следующим образом :

byte b = 1; 
Long l = b; 

b заменено на Byte (первый бокс), но не может быть изменен на Long, потому что Byte не является подклассом Long.

В более этапов:

byte b = 1; 
Byte byteB = b; //works 
Long l = byteB; //doesn't work 
+0

Но для того, чтобы байт был байтом, он должен быть помещен в коробку первым, и речь идет о расширении, а затем бокс не допускается ... Я имею в виду, если я вручную расширю байт до конца, я могу вызвать функцию Long, используя вторую , Разве разработчики просто запретили это, потому что это может быть слишком медленно? Я не могу просто обвести голову вокруг рассуждений о том, почему бокс, а затем расширение будет разрешено, но расширение и бокс не будут. – Jack

+0

Часть книги, которую вы читаете, не касается «расширения и бокса», это пример того, что «бокс и расширение» не является.Это как раз перед цитатой: «Почему компилятор не попытался использовать логику ** box-then-widen **, когда он пытался справиться с классом WidenAndBox?» –

+0

На самом деле, похоже, обоим. Или я действительно неправильно истолковываю это. Я обновил свой оригинальный пост ссылкой на страницу. – Jack

3

В основном это означает, что расширение работает только с примитивными типами, а не фантики. Если вы поставите первую коробку, вы получите обертку (byte ->Byte). Но обертки - Byte, Double, Float, Integer, Long и Short не имеют отношения к наследству (IS-A). A Long параметр не может принимать, например, Byte.

Таким образом, вы должны расширить первым (byte ->long), а затем окно (long ->Long).

+0

Причина, по которой это расширение становится невозможным, мне понятно. В конце концов, байт не является экземпляром Long. Но они, похоже, не делают различия. Я знаю, что легко принять расширение, и тогда бокс не разрешается, как правило, но мне очень любопытно, почему. – Jack

+1

Я думаю, что язык книги сбивает с толку. Но это то, что, вероятно, подразумевается. Нет понятия расширения для оберток, то есть 'Byte' ->' Short' -> 'Integer' ->' Long' -> 'Double', поэтому вопрос о расширении после бокса в этом контексте не возникает. – samitgaur

4

Язык смущает.

В принципе, вы не можете идти таким образом:
байт -> Байт -> Длинные
потому Byte и Лонг не разделяют это-отношения.
Итак, он пытается это сделать:
byte -> long -> Long
Но он не может этого сделать (видимо, из-за ограничений компилятора). Таким образом, он выходит из строя и выдает ошибку.

Но, с другой стороны, вы можете сделать это:
байт -> Байт -> Объект
, потому что Байт-объект.

рассмотрим 2 функции и переменных байты:

toLong (х) Длинные
ToObject (Объект х)
байты B = 5;

Тогда это заявление будет незаконным:
10 toLong (b);
// потому что b -> новый байт (b) -> новый длинный (новый байт (b)) является незаконным.
И байт -> длинный -> Длинный не может быть выполнен из-за ограничений компилятора.

, но это заявление является законным:
toObject (b);
// потому что b -> новый байт (b) -> новый объект (новый байт (b)) является законным.

1

В сущности, правила выставляются, а затем расширяются, но не расширяются. Однако, если бокс, расширяющийся, тогда расширяемый класс должен находиться в том же дереве наследования, что и класс, к которому вы расширяетесь.

В то время как показанный пример пытается вставить затем расширение, причина его недействительности состоит в том, что байт не является длинным, т. Е. Они не находятся в одном дереве наследования. Однако, если в примере использовались байты и числовые, то вы были бы действительны для байт-байт в байте, а затем расширили байт до числового в виде байта IS-A Numeric (они находятся в одном дереве наследования)

4

Причина, по которой «расширение то бокс»не допускается, может быть из-за следующей причине (стр 249 книги SCJP):

Java 5 дизайнеры решили, что самое главное правило должно быть , что существовавшие ранее код должен функционировать так, как раньше , так как начиная с расширение возможностей уже существует, метод, который вызывается через , расширение не должно терять вновь созданный метод, который полагается на bo xing