В Java передбачено сім видів приведення:
- тотожне (identity);
- розширення примітивного типу (widening primitive);
- звуження примітивного типу (narrowing primitive);
- розширення об'єктного типу (widening reference);
- звуження об'єктного типу (narrowing reference);
- перетворення до рядка (String);
- заборонені перетворення (forbidden).
Розглянемо їх окремо.
Перетворення примітивних типів (розширення та звуження)
Для простих типів розширення означає, що здійснюється перехід від менш місткого типу до більш місткого. Наприклад, від типу byte (довжина 1 байт) до типу int (довжина 4 байти). Такі перетворення безпечні в тому сенсі, що новий тип завжди гарантовано вміщає в собі всі дані, які зберігалися в старому типі, і таким чином не відбувається втрати даних. Саме тому компілятор здійснює його сам, непомітно для розробника:
byte b = 3;
int a = b;
Наступні 19 перетворень є такими, що розширяються
від byte до short, int, long, float, double
від short до int, long, float, double
від char до int, long, float, double
від int до long, float, double
від long до float, double
від float до double
Тим не менш, слід пам'ятати, що навіть при розширені, дані все-таки можуть бути в особливих випадках спотворені.
Зворотне перетворення (звуження) - означає, що перехід здійснюється від більш місткого типу до менш місткого. При такому перетворенні є ризик втратити дані. Наприклад, якщо число типу int було більше 127, то при приведенні його до byte значення бітів старше восьмого будуть втрачені. В Java таке перетворення повинно відбуватися явним чином, тобто програміст в коді винний явно вказати, що він має намір здійснити таке перетворення і готовий при необхідності втратити дані.
Наступні 23 перетворення є звужуючими:
від byte до char
від short до byte, char
від char до byte, short
від int до byte, short, char
від long до byte, short, char, int
від float до byte, short, char, int, long
від double до byte, short, char, int, long, float
При звуженні цілочисельного типу до більш вузького цілочисельного всі старші біти, які не потрапляють у новий тип, просто відкидаються. Не проводитися ніякого округлення або інших дій для отримання більш коректного результату: