Java Language
Преобразование типа
Поиск…
Синтаксис
- TargetType target = (SourceType) источник;
Нецифровое примитивное литье
boolean
тип не может быть отброшен в / из любого другого примитивного типа.
char
может быть преобразован в / из любого числового типа, используя сопоставления кодовых точек, заданные Unicode. char
представлен в памяти как неподписанное 16-битовое целочисленное значение (2 байта), поэтому отбрасывание до byte
(1 байт) приведет к удалению 8 из этих битов (это безопасно для символов ASCII). Методы утилиты класса Character
используют int
(4 байта) для передачи в / из значений кодовой точки, но для хранения кодовой точки Unicode также достаточно short
(2 байта).
int badInt = (int) true; // Compiler error: incompatible types
char char1 = (char) 65; // A
byte byte1 = (byte) 'A'; // 65
short short1 = (short) 'A'; // 65
int int1 = (int) 'A'; // 65
char char2 = (char) 8253; // ‽
byte byte2 = (byte) '‽'; // 61 (truncated code-point into the ASCII range)
short short2 = (short) '‽'; // 8253
int int2 = (int) '‽'; // 8253
Численное примитивное литье
Числовые примитивы можно отличить двумя способами. Неявное литье происходит, когда тип источника имеет меньший диапазон, чем целевой тип.
//Implicit casting
byte byteVar = 42;
short shortVar = byteVar;
int intVar = shortVar;
long longVar = intvar;
float floatVar = longVar;
double doubleVar = floatVar;
Явное литье должно выполняться, когда тип источника имеет больший диапазон, чем целевой тип.
//Explicit casting
double doubleVar = 42.0d;
float floatVar = (float) doubleVar;
long longVar = (long) floatVar;
int intVar = (int) longVar;
short shortVar = (short) intVar;
byte byteVar = (byte) shortVar;
При отливке примитивов с плавающей запятой ( float
, double
) и целых чисел число округляется .
Литье объектов
Как и в случае с примитивами, объекты могут быть указаны как явно, так и неявно.
Неявное кастинг происходит, когда тип источника расширяет или реализует целевой тип (отбрасывание на суперкласс или интерфейс).
Явное литье должно выполняться, когда тип источника расширяется или реализуется целевым типом (приведение к подтипу). Это может привести к исключению среды выполнения ( ClassCastException
), когда объект, который выполняется, не относится к типу цели (или подтипу цели).
Float floatVar = new Float(42.0f);
Number n = floatVar; //Implicit (Float implements Number)
Float floatVar2 = (Float) n; //Explicit
Double doubleVar = (Double) n; //Throws exception (the object is not Double)
Основное числовое продвижение
static void testNumericPromotion() {
char char1 = 1, char2 = 2;
short short1 = 1, short2 = 2;
int int1 = 1, int2 = 2;
float float1 = 1.0f, float2 = 2.0f;
// char1 = char1 + char2; // Error: Cannot convert from int to char;
// short1 = short1 + short2; // Error: Cannot convert from int to short;
int1 = char1 + char2; // char is promoted to int.
int1 = short1 + short2; // short is promoted to int.
int1 = char1 + short2; // both char and short promoted to int.
float1 = short1 + float2; // short is promoted to float.
int1 = int1 + int2; // int is unchanged.
}
Тестирование, если объект может быть запущен с использованием instanceof
Java предоставляет оператору instanceof
проверку, является ли объект определенным типом или подклассом этого типа. Затем программа может выбрать, чтобы бросить или не отбросить этот объект соответственно.
Object obj = Calendar.getInstance();
long time = 0;
if(obj instanceof Calendar)
{
time = ((Calendar)obj).getTime();
}
if(obj instanceof Date)
{
time = ((Date)obj).getTime(); // This line will never be reached, obj is not a Date type.
}