0Pricing
Java Academy · Leçon

La conversion de types en pratique

Appliquez la conversion de types à des situations concrètes, notamment aux calculs numériques et aux hiérarchies de programmation orientée objet.

La conversion de types en pratique est une leçon Java Academy gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Java Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Java Academy comprend 4 leçons au total.

La conversion de type en pratique

La conversion de type est omniprésente dans le code Java réel : calculs numériques, hiérarchies de programmation orientée objet, collections génériques et interfaces de programmation anciennes. Cette leçon présente des modèles pratiques et leurs pièges.

Conversion ascendante : polymorphisme

Une conversion ascendante transforme un sous-type en supertype. Elle est toujours sûre et implicite : aucun opérateur de conversion n’est nécessaire. Cela permet le polymorphisme.

class Payment {}
class CreditCardPayment extends Payment {
    public void authorizeCard() {}
}

CreditCardPayment cc = new CreditCardPayment();
Payment p = cc; // implicit upcast — always safe

// p.authorizeCard(); // Compile error — Payment doesn't have this method
// need downcast to access subclass methods

Conversion descendante : accéder aux membres d’un sous-type

Une conversion descendante reconvertit une référence de supertype vers le sous-type d’origine. Elle nécessite une conversion explicite et lève ClassCastException si l’objet n’est pas réellement une instance de ce sous-type.

Payment p = new CreditCardPayment();

// Downcast to access CreditCardPayment-specific method
if (p instanceof CreditCardPayment cc) {
    cc.authorizeCard(); // safe with pattern matching
    System.out.println("Card authorized");
}

// Unsafe downcast without check:
try {
    BankTransfer bt = (BankTransfer) p; // ClassCastException!
} catch (ClassCastException e) {
    System.out.println("Wrong type!");
}

Conversions numériques dans les calculs

La division entière tronque le résultat. Convertissez en double avant la division pour obtenir un résultat précis. C’est l’un des problèmes arithmétiques les plus fréquents en Java.

int totalRevenue = 1000;
int months = 3;

// Integer division — truncates!
double wrong = totalRevenue / months;
System.out.println(wrong); // 333.0 (not 333.33)

// Correct: cast one operand to double first
double correct = (double) totalRevenue / months;
System.out.println(correct); // 333.3333333333333

Conversions dans les collections (avant les génériques)

Le code ancien stocke souvent des objets dans des collections brutes. Une conversion descendante est nécessaire pour récupérer des valeurs typées : vérifiez toujours d’abord avec instanceof.

import java.util.*;

// Legacy raw list (pre-Java 5 style)
List legacyList = new ArrayList();
legacyList.add("Alice");
legacyList.add(42);

for (Object item : legacyList) {
    if (item instanceof String s) {
        System.out.println("Name: " + s.toUpperCase());
    } else if (item instanceof Integer n) {
        System.out.println("Score: " + (n * 2));
    }
}

Conversions avec des interfaces

Un objet peut être converti vers n’importe quelle interface qu’il implémente, ce qui permet de l’utiliser dans des contextes qui exigent cette interface.

interface Printable { void print(); }
interface Saveable  { void save(); }

class Report implements Printable, Saveable {
    public void print() { System.out.println("Printing report"); }
    public void save()  { System.out.println("Saving report"); }
}

Object obj = new Report();

if (obj instanceof Printable p) p.print();
if (obj instanceof Saveable s) s.save();

Conversions avec des tableaux

Les types de tableaux forment leur propre hiérarchie. Un String[] est un sous-type de Object[]. Les conversions de tableaux suivent les mêmes règles que celles des objets.

String[] names = {"Alice", "Bob"};
Object[] objs = names;   // upcast — implicit

objs[0] = "Charlie";     // OK — still a String

try {
    objs[0] = 42;          // ArrayStoreException at runtime!
} catch (ArrayStoreException e) {
    System.out.println("Cannot store Integer in String[]");
}

// Downcast back
String[] restored = (String[]) objs;

Exemple de commerce en ligne : sélection du paiement

Exemple concret : sélectionner le bon processeur de paiement en fonction du type du paiement à l’exécution.

interface Payment { double amount(); }
record CreditCard(String last4, double amount) implements Payment {}
record CryptoPayment(String wallet, double amount) implements Payment {}
record BankWire(String iban, double amount) implements Payment {}

static void process(Payment p) {
    switch (p) {
        case CreditCard cc     -> System.out.println("Charging card *" + cc.last4());
        case CryptoPayment cp  -> System.out.println("Sending to wallet " + cp.wallet());
        case BankWire bw       -> System.out.println("Wiring to IBAN " + bw.iban());
    }
}

process(new CreditCard("4242", 99.99));
process(new CryptoPayment("0xABCD", 0.05));

Conversion en Number pour les calculs génériques

La superclasse Number permet d’effectuer des opérations numériques génériques sur n’importe quel type de nombre, en réalisant une conversion ascendante vers Number puis en appelant doubleValue().

import java.util.List;

List<Number> numbers = List.of(1, 2.5, 3L, 4.0f);

double sum = 0;
for (Number n : numbers) {
    sum += n.doubleValue(); // works for int, double, long, float
}
System.out.printf("Sum: %.1f%n", sum); // 10.5

Méthode utilitaire de conversion sûre

Une méthode utilitaire réutilisable qui renvoie un Optional vide au lieu de lever une exception en cas de conversion incorrecte : idéale pour du code organisé en pipeline.

import java.util.Optional;

public static <T> Optional<T> safeCast(Object obj, Class<T> clazz) {
    return clazz.isInstance(obj)
        ? Optional.of(clazz.cast(obj))
        : Optional.empty();
}

// Usage
Object val = "hello";
safeCast(val, String.class)
    .ifPresent(s -> System.out.println(s.toUpperCase())); // HELLO

safeCast(val, Integer.class)
    .ifPresentOrElse(
        n -> System.out.println(n),
        () -> System.out.println("Not an Integer") // prints this
    );

Erreurs courantes à éviter

Faites attention aux erreurs de conversion courantes suivantes :

  • Oublier de convertir avant une division : int/int produit toujours un entier
  • Effectuer une conversion descendante sans vérifier avec instanceof → ClassCastException
  • Confondre la conversion ascendante (sûre) et la conversion descendante (risquée)
  • Confondre les types enveloppes : (int) longVal et longVal.intValue()
// Mistake 1: integer division
double avg = 7 / 2;            // 3.0 — WRONG
double fixed = 7.0 / 2;        // 3.5 — correct

// Mistake 2: unwrapping Long as int
Long bigId = 1234567890123L;
// int id = (int) bigId;  // compiles but truncates!
long id = bigId;           // correct

System.out.println(avg);   // 3.0
System.out.println(fixed); // 3.5
System.out.println(id);    // 1234567890123

Vérification rapide

Quelle est la sortie de ce code ?

int a = 7;
int b = 2;
double result = (double) a / b;
System.out.println(result);

Récapitulatif&nbsp;: la conversion de type en pratique

Points essentiels :

  • La conversion ascendante (sous-type → supertype) est implicite et toujours sûre
  • La conversion descendante (supertype → sous-type) nécessite une conversion explicite : utilisez instanceof au préalable
  • La correspondance de motifs avec instanceof combine la vérification et la conversion dans une seule expression
  • Convertissez le numérateur en double avant la division pour éviter la troncature entière
  • Utilisez la correspondance de motifs de switch pour sélectionner clairement selon le type
  • Créez des utilitaires safeCast pour travailler avec Optional plutôt qu’avec des exceptions

Questions Fréquemment Posées

La leçon « La conversion de types en pratique » est-elle gratuite ?

Oui — le texte complet de « La conversion de types en pratique » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Java Academy, passe à CoddyKit PRO. Le cours Java Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « La conversion de types en pratique » ?

Appliquez la conversion de types à des situations concrètes, notamment aux calculs numériques et aux hiérarchies de programmation orientée objet. Tu pratiques Java Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer Java Academy ?

Aucune expérience préalable n'est requise. Java Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.

Combien de temps prend la leçon « La conversion de types en pratique » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon Java Academy ?

Oui. Chaque leçon Java Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Types primitifs et types de référence
  2. Conversions avec élargissement et réduction
  3. L’opérateur instanceof
  4. La conversion de types en pratique
← Retour à Java Academy