0Pricing
Java Academy · レッスン

型キャストの実践

数値計算や OOP の継承階層など、実際の場面で型キャストを適用します。

「型キャストの実践」はCoddyKit上の無料Java Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJava Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Java Academyコースには全4レッスンが含まれています。

型キャストの実践

型キャストは、数値計算、オブジェクト指向の継承階層、ジェネリックコレクション、レガシーAPIなど、実際のJavaコードで広く使われています。このレッスンでは、実用的なパターンと注意点を扱います。

アップキャスト:ポリモーフィズム

アップキャストは、サブタイプをスーパータイプに変換することです。常に安全で暗黙的に行われるため、キャスト演算子は必要ありません。これによりポリモーフィズムを利用できます。

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

ダウンキャスト:サブタイプのメンバーへのアクセス

ダウンキャストは、スーパータイプの参照を元のサブタイプに戻すことです。明示的なキャストが必要で、オブジェクトが実際にはそのサブタイプでない場合はClassCastExceptionがスローされます。

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

計算における数値キャスト

整数除算では切り捨てが行われます。正確な結果を得るには、除算の前にdoubleへキャストしてください。これは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

コレクションでのキャスト(ジェネリクス以前)

レガシーコードでは、rawコレクションにオブジェクトを格納することがよくあります。型付きの値を取得するにはダウンキャストが必要です。必ず最初に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));
    }
}

インターフェースを使ったキャスト

オブジェクトは実装している任意のインターフェースにキャストでき、そのインターフェースを必要とするコンテキストで使用できます。

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

配列のキャスト

配列型にも独自の継承階層があります。String[]はObject[]のサブタイプです。配列のキャストにも、オブジェクトと同じ規則が適用されます。

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コマースの例:支払い処理の振り分け

実際の開発での例です。支払いの実行時の型に基づいて、適切な支払い処理を振り分けます。

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

汎用的な計算のためのNumberへのキャスト

Numberスーパー クラスにアップキャストし、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

安全なキャストユーティリティメソッド

不正なキャストで例外をスローする代わりに、空のOptionalを返す再利用可能なユーティリティメソッドです。パイプライン形式のコードに適しています。

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

避けるべきよくあるミス

次のような、よくあるキャストのミスに注意してください:

  • 除算の前にキャストし忘れる:int/intは常に整数になります
  • instanceofで確認せずにダウンキャストする → ClassCastException
  • 安全なアップキャストと危険なダウンキャストを混同する
  • ラッパー型のキャストを混同する:(int) longValと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

クイックチェック

次のコードの出力は何でしょうか?

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

復習:型キャストの実践

重要なポイント:

  • アップキャスト(サブタイプ→スーパータイプ)は暗黙的で、常に安全です
  • ダウンキャスト(スーパータイプ→サブタイプ)には明示的なキャストが必要です。先にinstanceofを使用してください
  • パターンマッチングinstanceofでは、1つの式で確認とキャストを組み合わせられます
  • 整数の切り捨てを避けるには、除算の前に分子をdoubleへキャストします
  • 型に基づく振り分けには、パターンマッチングswitchを使用します
  • safeCastユーティリティを作成し、例外の代わりにOptionalを使用します

よくある質問

「型キャストの実践」レッスンは無料ですか?

はい。「型キャストの実践」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Java Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Java Academyコースには全4レッスンが含まれています。

「型キャストの実践」で何を学びますか?

数値計算や OOP の継承階層など、実際の場面で型キャストを適用します。 ブラウザで直接実行するハンズオンコードでJava Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Java Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのJava Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「型キャストの実践」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このJava Academyレッスンでコードを書いて実行できますか?

はい。すべてのJava Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. プリミティブ型と参照型
  2. 拡大変換と縮小変換
  3. instanceof 演算子
  4. 型キャストの実践
← Java Academyに戻る