Java Academy · leksjon

Typekonvertering i praksis

Bruk typekonvertering i realistiske scenarioer, blant annet numeriske beregninger og OOP-hierarkier.

Leksjon 4 av 413 trinn

Typekonvertering i praksis er en gratis leksjon i Java Academy på CoddyKit. Dette er leksjon 4 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Java Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Java Academy inneholder totalt 4 leksjoner.

Typecasting i praksis

Typecasting brukes overalt i ekte Java-kode: i numeriske beregninger, OOP-hierarkier, generiske samlinger og eldre API-er. Denne leksjonen dekker praktiske mønstre og fallgruver.

Upcasting: Polymorfisme

En upcast konverterer en undertype til en supertype. Det er alltid trygt og skjer implisitt – ingen cast-operator er nødvendig. Dette muliggjør polymorfisme.

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

Downcasting: Tilgang til medlemmer i undertypen

En downcast konverterer en supertype-referanse tilbake til den opprinnelige undertypen. Det krever eksplisitt casting og kaster ClassCastException hvis objektet faktisk ikke er en instans av denne undertypen.

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

Heltallsdivisjon avkortes. Cast til double før divisjonen for å få et presist resultat. Dette er en av de vanligste aritmetiske feilene 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)

Eldre kode lagrer ofte objekter i rå samlinger. Downcasting er nødvendig for å hente typede verdier – kontroller alltid med instanceof først.

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 grensesnitt

Et objekt kan castes til ethvert grensesnitt det implementerer, slik at De kan bruke det i sammenhenger som krever dette grensesnittet.

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 tabeller

Tabelltyper danner sitt eget hierarki. En String[] er en undertype av Object[]. Casting av tabeller følger de samme reglene 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: Valg av betalingsbehandler

Et praktisk eksempel: Velg riktig betalingsbehandler basert på betalingens type ved kjøring.

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 matematikk

Superklassen Number lar Dem utføre generiske numeriske operasjoner på alle talltyper ved å upcaste til Number og kalle 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

Verktøymetode for sikker casting

En gjenbrukbar verktøymetode som returnerer en tom Optional i stedet for å kaste et unntak ved ugyldig casting – utmerket for 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
    );

Vanlige feil som bør unngås

Vær oppmerksom på disse vanlige casting-feilene:

  • Glemme å caste før divisjon: int/int gir alltid et heltall
  • Downcasting uten instanceof-kontroll → ClassCastException
  • Forveksle upcasting (trygt) med downcasting (risikabelt)
  • Casting av wrapper-typer: (int) longVal versus 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

Hurtigsjekk

Hva blir resultatet av denne koden?

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

Oppsummering: Typecasting i praksis

Viktigste punkter:

  • Upcast (undertype → supertype) er implisitt og alltid trygt
  • Downcast (supertype → undertype) krever eksplisitt casting; bruk instanceof først
  • Mønstergjenkjenning med instanceof kombinerer kontroll og casting i ett uttrykk
  • Cast telleren til double før divisjon for å unngå avkorting til heltall
  • Bruk switch-mønstergjenkjenning for ryddig typebasert fordeling
  • Bygg safeCast-verktøy for å arbeide med Optional i stedet for unntak
Gratis å komme i gang

Lær deg Java med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
104
Leksjoner
374

Ofte stilte spørsmål

Er leksjonen «Typekonvertering i praksis» gratis?

Ja – hele teksten i «Typekonvertering i praksis» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Java Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Java Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Typekonvertering i praksis»?

Bruk typekonvertering i realistiske scenarioer, blant annet numeriske beregninger og OOP-hierarkier. Du øver på Java Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Java Academy?

Ingen tidligere erfaring er nødvendig. Java Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 4 av 4.

Hvor lang tid tar leksjonen «Typekonvertering i praksis»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Java Academy-leksjonen?

Ja. Alle Java Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Primitive typer kontra referansetyper
  2. Utvidende og innsnevrende konverteringer
  3. instanceof-operatoren
  4. Typekonvertering i praksis
← Tilbake til Java Academy