Java Academy · Lektion

Typecasting i praksis

Anvend typecasting i realistiske scenarier, herunder numeriske beregninger og OOP-hierarkier.

Lektion 4 af 413 trin

Typecasting i praksis er en gratis Java Academy-lektion på CoddyKit. Dette er lektion 4 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Java Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Java Academy-kurset indeholder 4 lektioner i alt.

Typecasting i praksis

Typecasting bruges overalt i Java-kode fra virkelige programmer: numeriske beregninger, OOP-hierarkier, generiske samlinger og ældre API'er. Denne lektion gennemgår praktiske mønstre og faldgruber.

Upcast: Polymorfi

Et upcast konverterer en undertype til en supertype. Det er altid sikkert og implicit — der er ikke brug for en cast-operator. Det muliggør polymorfi.

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

Downcast: Adgang til undertypens medlemmer

Et downcast konverterer en reference til en supertype tilbage til den oprindelige undertype. Det kræver et eksplicit cast og kaster ClassCastException, hvis objektet faktisk ikke er af den undertype.

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!");
}

Numerisk casting i beregninger

Heltalsdivision afkortes. Cast til double før divisionen for at få et præcist resultat. Det er en af de mest almindelige aritmetiske fejl i 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

Casting i samlinger (før generiske typer)

Ældre kode gemmer ofte objekter i rå samlinger. Downcasting er nødvendigt for at hente værdier med den rigtige type — kontrollér altid først med 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));
    }
}

Casting med grænseflader

Et objekt kan castes til enhver grænseflade, som det implementerer, så du kan bruge det i sammenhænge, der kræver denne grænseflade.

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();

Casting med arrays

Array-typer danner deres eget hierarki. En String[] er en undertype af Object[]. Casting af arrays følger de samme regler som for objekter.

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;

E-handelseksempel: Fordeling af betalinger

Et eksempel fra virkelige programmer: Vælg den rigtige betalingsbehandler ud fra betalingens type ved kørsel.

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));

Casting til Number for generisk matematik

Supertypen Number lader dig udføre generiske numeriske operationer på alle taltyper ved at upcaste til Number og kalde 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

Hjælpemetode til sikker casting

En genanvendelig hjælpemetode, der returnerer en tom Optional i stedet for at kaste en fejl ved ugyldige casts — velegnet til kode i pipeline-stil.

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
    );

Almindelige fejl, du bør undgå

Vær opmærksom på disse almindelige fejl ved casting:

  • At glemme at caste før division: int/int giver altid et heltal
  • Downcasting uden en instanceof-kontrol → ClassCastException
  • At forveksle upcasting (sikkert) med downcasting (risikabelt)
  • At caste wrapper-typer: (int) longVal kontra 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

Hurtigt tjek

Hvad er resultatet af denne kode?

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

Opsamling: Typecasting i praksis

Vigtigste pointer:

  • Upcast (undertype → supertype) er implicit og altid sikkert
  • Downcast (supertype → undertype) kræver et eksplicit cast; brug instanceof først
  • Mønstermatchning med instanceof kombinerer kontrol og cast i ét udtryk
  • Cast tælleren til double før division for at undgå heltalsafkortning
  • Brug switch-mønstermatchning til enkel typebaseret fordeling
  • Byg safeCast-hjælpemetoder, så du kan arbejde med Optional i stedet for undtagelser
Gratis at komme i gang

Lær Java med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
104
Lektioner
374

Ofte stillede spørgsmål

Er lektionen “Typecasting i praksis” gratis?

Ja — hele teksten til “Typecasting i praksis” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Java Academy-kurset, skal du opgradere til CoddyKit PRO. Java Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Typecasting i praksis”?

Anvend typecasting i realistiske scenarier, herunder numeriske beregninger og OOP-hierarkier. Du øver dig i Java Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Java Academy?

Der kræves ingen tidligere erfaring. Java Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 4 af 4.

Hvor lang tid tager lektionen “Typecasting i praksis”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Java Academy-lektion?

Ja. Alle Java Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Primitive typer vs. referencetyper
  2. Udvidende og indsnævrende konverteringer
  3. Operatoren instanceof
  4. Typecasting i praksis
← Tilbage til Java Academy