WDH Java - Преобразувания на типове

Всеки израз в Java има тип, който се определя от структурата на израза и типовете на съставните му операнди (константи, променливи и методи). Понякога обаче може да се наложи да преобразуваме изрично израз в друг тип. Освен това, в някои ситуации самата система за изпълнение на Java имплицитно извършва такива преобразувания.

Преобразуването от тип T1 в тип T2 позволява израз на тип T1 да бъде третиран по време на компилация като израз на тип T2. В някои случаи това е чисто синтактична конструкция, която не засяга генерирания код; в други преобразуването на типа изисква допълнителни действия по време на изпълнение, за да се промени стойността на израза или допълнителни проверки за коректността на приложеното преобразуване. Примери:

Останалата част от тази глава предоставя класификация на всички възможни преобразувания на типове и след това класификация на контекстите, в които те могат да бъдат използвани.

5.4.1.1. Разширяване на преобразувания на числа

Разширяване на преобразуванията на числа ? това са преобразувания от числов тип в "по-голям" числов тип, които се считат за безопасни, тъй като не водят до загуба на стойността на преобразуваната стойност. Такива преобразувания в Java са:

  • трансформации байт в къс, инт, дълго, плувка и двойно;
  • трансформации къс в инт, дълго, плувка и двойно;
  • трансформации char в инт, дълго, плувка и двойно;
  • трансформации инт в дълго, плувка и двойно;
  • трансформации дълго в плувка и двойно;
  • трансформации плувка в двойно.

Всъщност преобразуването на целочислена стойност в плаваща стойност може да доведе до загуба на точност, т.е.загуба на значими цифри. Така че следният пример

ще покаже низа 1234567936. Това се дължи на факта, че при конвертиране инт в плувка получената стойност е 1,2345679E9 поради факта, че мантисата от числа харесва плувка побира само 8 десетични цифри (тук преобразуването във тип трябва да се използва за правилна работа двойно). Системата за изпълнение обаче никога не генерира грешки при извършване на изброените трансформации.

5.4.1.2. Тесни преобразувания на числа

Тесни преобразувания на числа ? това са преобразувания от числов тип в "по-малък" цифров тип, който може да доведе както до загуба на величина, така и до загуба на точност. Такива преобразувания в Java са:

  • трансформации байт в char;
  • трансформации къс в байт и char;
  • трансформации инт в байт, къс и char;
  • трансформации дълго в байт, къс, инт и char;
  • трансформации плувка в байт, къс, инт, дълго и char;
  • трансформации двойно в байт, къс, инт, дълго, плувка и char;

Тук няма да разглеждаме подробно правилата, по които се извършват тези трансформации, тъй като те са интуитивно разбираеми и формално доста тромави. Когато ги използвате, важно е да запомните, че Java, за разлика от други езици, не генерира грешки в случай на препълване или преливане, така че контролът върху коректността на трансформациите пада изцяло върху програмиста.

5.4.1.3. Разгъваеми трансформации на връзки

Разширяване на конверсии на връзки ? те са преобразувания от производни референтни типове към техните предци, които не изискват никакви действия по време на изпълнение и никога не генерират грешки. Такива преобразувания в Java са:

  • преобразуване на който и да е клас или интерфейс към неговия предшественик (по-специално към типа Обект);
  • преобразуване на клас в интерфейс, който той прилага;
  • конвертиране на който и да е масив в Object или Cloneable;
  • преобразуване на масив от тип S [] в масив от тип T [], ако S и T ? референтни типове и преобразуването от S в T се разширява;
  • преобразуване на тип null във всеки референтен тип.

5.4.1.4. Конверсии за стесняване на връзки

Тесни конверсии на връзки ? те са преобразувания от производни референтни типове към техните низходящи типове. Тези преобразувания изискват проверка на тяхната легитимност по време на изпълнение и могат да хвърлят ClassCastException. Такива преобразувания в Java са: