Javaの概念の1つに「型キャスト」というものがあります。型キャストは、異なるデータ型間で値を変換する際に必要となる重要な機能で、正しく理解していないと予期せぬバグやエラーの原因となることもあります。
このページでは、初心者の方にも分かりやすいように、型キャストの基本から安全な使い方、そして注意点までを丁寧に解説します。
Java:型キャストとは?
型キャスト(Type Casting)とは、あるデータ型の値を他のデータ型に変換することを指します。Javaでは主に以下の2種類の型キャストがあります。
- プリミティブ型の型キャスト:intやdoubleなどの基本データ型間の変換
- オブジェクト型の型キャスト:クラスやインターフェース間の変換
それぞれの型キャストには特有のルールや注意点がありますので、順を追って詳しく見ていきましょう。
プリミティブ型の型キャスト
プリミティブ型とはJavaで基本的なデータ型のことで、数値型や文字型、真偽値型などがあります。プリミティブ型の型キャストには、「暗黙的な型変換」と「明示的な型変換」の2種類があります。
暗黙的な型変換(ワイドニング)
暗黙的な型変換(ワイドニングとも呼ばれます)は、小さいサイズのデータ型から大きいサイズのデータ型への変換を自動的に行うものです。この変換は安全であり、データの損失がないため、特別な記述は不要です。
例:int
型の値が自動的にlong
やdouble
型に変換される
int intNum = 100; long longNum = intNum; // intからlongへ自動的に変換 double doubleNum = intNum; // intからdoubleへ自動的に変換
明示的な型変換(ナロイング)
一方、明示的な型変換(ナロイング)は、大きいサイズのデータ型から小さいサイズのデータ型へ変換する際に必要です。この場合、データの損失が起こる可能性があるため、明示的に型を指定して変換する必要があります。
🔑 明示的な型変換を必要とするのは以下の2パターン
覚え方 | 内容 |
---|---|
✅ 少数 → 整数 | 情報(小数点以下)が失われるので、明示的なキャストが必要 |
✅ 範囲が大きい型 → 小さい型 | データが入りきらない可能性があるので、明示的なキャストが必要 |
キャスト演算子()
キャストの構文ルールは非常にシンプルで、基本的にはキャスト演算子 ()
を使うだけ。
(キャストしたい型) 値や変数
例:明示的に型を指定して変換
double doubleNum = 123.45; int intNum = (int) doubleNum; // doubleからintへ明示的にキャスト System.out.println(intNum); // 出力: 123
intは整数であるため↑の例では小数点以下の値が切り捨てられています。つまり、123.45
が123
になっています。
注意点としては、このパターンの型変換はキャスト演算子()
などを利用して明示的な記述が必要なこと、データの損失:小数部分の切り捨てやオーバーフローが起こる可能性があるという点。この2点を抑えておきましょう。
オブジェクト型の型キャスト
オブジェクト型の型キャストは、クラス間の継承関係を利用して行われます。ここでは、アップキャストとダウンキャストの2種類があります。
アップキャスト
アップキャストとは、サブクラスのインスタンスをスーパークラスの型に変換することです。これは暗黙的に行われ、特別な記述は不要です。
class Animal { void speak() { System.out.println("Animal speaks"); } } class Dog extends Animal { void speak() { System.out.println("Dog barks"); } } Dog dog = new Dog(); Animal animal = dog; // Dog型をAnimal型にアップキャスト animal.speak(); // 出力: Dog barks
アップキャストは安全であり、サブクラスが持つ機能をスーパークラスの型で扱いたいときに使います。
ダウンキャスト
ダウンキャストとは、スーパークラスの型をサブクラスの型に変換することです。これは明示的な型キャストが必要で、実行時にClassCastException
が発生する可能性があるため注意が必要です。
Animal animal = new Dog(); // Animal型の変数にDogのインスタンスを代入 Dog dog = (Dog) animal; // Animal型をDog型にダウンキャスト dog.speak(); // 出力: Dog barks
注意点:
- 実行時エラーの可能性:
animal
が実際にはDog
のインスタンスでない場合、ClassCastException
が発生します。 - 明示的なキャストが必要:
(Dog)
のようにキャスト演算子を使います。
ダウンキャストの安全な使い方
ダウンキャストは便利な反面、実行時エラーを引き起こす可能性があります。そこで、安全にダウンキャストを行うための方法を紹介します。
instanceof演算子の活用
instanceof
演算子を使うことで、オブジェクトが特定のクラスのインスタンスであるかをチェックできます。
Animal animal = getAnimal(); if (animal instanceof Dog) { Dog dog = (Dog) animal; dog.speak(); } else { System.out.println("animal is not an instance of Dog"); }
このように事前に型を確認することで、ClassCastException
の発生を防ぐことができます。
実際の業務での使用例
以下のような状況でinstanceof
を使って適切な型にキャストし、安全にデータを操作します。
Map<String, Object> dataMap = getDataMap(); Object value = dataMap.get("key"); if (value instanceof String) { String strValue = (String) value; // 文字列として処理 } else if (value instanceof Integer) { Integer intValue = (Integer) value; // 整数として処理 } else { // その他の型に対する処理 }