Java Academy · Lektion

Typomvandling i praktiken

Tillämpa typomvandling i verkliga scenarier, bland annat numeriska beräkningar och OOP-hierarkier.

Lektion 4 av 413 steg

Typomvandling i praktiken är en gratis lektion i Java Academy på CoddyKit. Detta är lektion 4 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Java Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Java Academy innehåller totalt 4 lektioner.

Typomvandling i praktiken

Typomvandling används överallt i verklig Java-kod: i numeriska beräkningar, OOP-hierarkier, generiska samlingar och äldre API:er. Den här lektionen behandlar praktiska mönster och fallgropar.

Uppkonvertering: polymorfism

En uppkonvertering konverterar en undertyp till en supertyp. Den är alltid säker och implicit – ingen typomvandlingsoperator behövs. Detta möjliggör polymorfism.

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

Nedkonvertering: åtkomst till undertypens medlemmar

En nedkonvertering konverterar en referens till en supertyp tillbaka till den ursprungliga undertypen. Den kräver en explicit typomvandling och kastar ClassCastException om objektet faktiskt inte är av den 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 typomvandling i beräkningar

Heltalsdivision trunkeras. Konvertera till double före division för att få ett precist resultat. Detta är ett av de vanligaste aritmetiska felen 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

Typomvandling i samlingar (före Generics)

Äldre kod lagrar ofta objekt i råa samlingar. Nedkonvertering behövs för att hämta värden med rätt typ – kontrollera 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));
    }
}

Typomvandling med gränssnitt

Ett objekt kan typomvandlas till vilket gränssnitt som helst som det implementerar, så att det kan användas i sammanhang där gränssnittet krävs.

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

Typomvandling med arrayer

Arraytyper bildar en egen hierarki. En String[] är en undertyp av Object[]. Typomvandling av arrayer följer samma regler som för objekt.

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-handel: dirigering av betalningar

Ett exempel från verkligheten: dirigera till rätt betalningsprocessor baserat på betalningens typ vid körning.

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

Typomvandling till Number för generiska beräkningar

Supertypen Number gör det möjligt att utföra generiska numeriska operationer på alla taltyper genom att uppkonvertera till Number och anropa 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älpmetod för säker typomvandling

En återanvändbar hjälpmetod som returnerar en tom Optional i stället för att kasta ett undantag vid felaktiga typomvandlingar – utmärkt för kod 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
    );

Vanliga misstag att undvika

Se upp med följande vanliga misstag vid typomvandling:

  • Glömma att göra typomvandling före division: int/int ger alltid ett heltal
  • Nedkonvertering utan instanceof-kontroll → ClassCastException
  • Förväxla uppkonvertering (säker) med nedkonvertering (riskfylld)
  • Typomvandling av wrapper-typer: (int) longVal jämfört med 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

Snabbkontroll

Vad blir resultatet av denna kod?

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

Sammanfattning: typomvandling i praktiken

Viktigaste punkterna:

  • Uppkonvertering (undertyp → supertyp) är implicit och alltid säker
  • Nedkonvertering (supertyp → undertyp) kräver en explicit typomvandling; använd instanceof först
  • Mönstermatchning med instanceof kombinerar kontroll och typomvandling i ett uttryck
  • Typomvandla täljaren till double före division för att undvika heltalstrunkering
  • Använd switch-mönstermatchning för tydlig typbaserad dispatch
  • Bygg safeCast-hjälpmetoder för att arbeta med Optional i stället för undantag
Gratis att börja

Lär dig Java med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
104
Lektioner
374

Vanliga frågor

Är lektionen ”Typomvandling i praktiken” gratis?

Ja – hela texten till ”Typomvandling i praktiken” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Java Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i Java Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”Typomvandling i praktiken”?

Tillämpa typomvandling i verkliga scenarier, bland annat numeriska beräkningar och OOP-hierarkier. Ni övar på Java Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig Java Academy?

Du behöver inga förkunskaper. Utbildningen i Java Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 4 av 4.

Hur lång tid tar lektionen ”Typomvandling i praktiken”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här Java Academy-lektionen?

Ja. Varje Java Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Primitiva typer kontra referenstyper
  2. Vidgande och avsmalnande konverteringar
  3. Operatorn instanceof
  4. Typomvandling i praktiken
← Tillbaka till Java Academy