Java Language
Conversion de type
Recherche…
Syntaxe
- TargetType target = (SourceType) source;
Coulée primitive non numérique
Le type boolean
ne peut être converti en / à partir d'aucun autre type primitif.
Une char
peut être coulé à / de tout type numérique en utilisant les mises en correspondance de point de code spécifié par Unicode. Une char
est représenté dans la mémoire en tant que valeur non signé Entier 16 bits (2 octets), de sorte que la coulée d' byte
(1 octet) va baisser 8 de ces bits (ce qui est sans danger pour les caractères ASCII). Les méthodes utilitaires de la classe Character
utilisent int
(4 octets) pour transférer vers / des valeurs de point de code, mais un short
(2 octets) suffirait également pour stocker un point de code Unicode.
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
Coulée primitive numérique
Les primitives numériques peuvent être converties de deux manières. La diffusion implicite se produit lorsque le type de source a une portée inférieure à celle du type cible.
//Implicit casting
byte byteVar = 42;
short shortVar = byteVar;
int intVar = shortVar;
long longVar = intvar;
float floatVar = longVar;
double doubleVar = floatVar;
La diffusion explicite doit être effectuée lorsque le type de source est plus large que le type cible.
//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;
Lors de la conversion de primitives en virgule flottante ( float
, double
) en primitives de nombres entiers, le nombre est arrondi au nombre inférieur .
Coulée d'objets
Comme pour les primitives, les objets peuvent être exprimés explicitement et implicitement.
La diffusion implicite se produit lorsque le type de source étend ou implémente le type cible (conversion vers une super-classe ou une interface).
Le transtypage explicite doit être effectué lorsque le type de source est étendu ou implémenté par le type cible (conversion en sous-type). Cela peut générer une exception d'exécution ( ClassCastException
) lorsque l'objet en cours de diffusion n'est pas du type cible (ou du sous-type de la cible).
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)
Promotion numérique de base
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.
}
Tester si un objet peut être converti en utilisant instanceof
Java fournit l'opérateur instanceof
pour tester si un objet est d'un certain type ou une sous-classe de ce type. Le programme peut alors choisir de lancer ou non cet objet en conséquence.
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.
}