読み込み中...

Javaにおける型変換の10個の方法【初心者向け】

Javaでの型変換の具体的なサンプルコードとその説明 Java
この記事は約24分で読めます。

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

本記事のサンプルコードを活用して機能追加、目的を達成できるように作ってありますので、是非ご活用ください。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を満たす現役のプログラマチームによって監修されています。

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

Javaの型変換は、数値計算、文字列処理、オブジェクト指向設計をつなぐ基礎知識です。特に初心者向けの学習では、intからdoubleへ広げる変換と、doubleからintへ絞る変換の違いを早めに整理すると、コンパイルエラーや例外の原因を追いやすくなります。

その理解を支えるため、Javaの公式仕様で説明される型の分類、暗黙の型変換、明示的なキャスト、Stringとの変換、ClassCastExceptionを避ける書き方までを、サンプルコード中心で解説します。関連する基礎として、コレクションを扱う場面ではJava List型完全ガイド、継承やメタ情報の理解にはJavaアノテーションの解説記事も参考になるのが基本です。

動作確認環境
  • Java SE 21
  • OpenJDK 21 / JShell または javac 21
📖 この記事で学べること
  • Javaのプリミティブ型と参照型の違い
  • 暗黙の型変換と明示的な型変換の使い分け
  • Stringと数値型を変換する代表的な書き方
  • ClassCastExceptionを避ける確認方法
  • 独自メソッドで型変換を扱う設計

Javaとは

Javaは、オブジェクト指向を中心に設計された汎用プログラミング言語です。コンパイルされた.classファイルはJVM上で実行されるため、同じJavaコードを複数の環境で動かしやすい構造になっています。

その特徴は、型の扱いにも表れます。Javaでは変数宣言時にintlongStringObjectなどの型を明示し、コンパイル時に多くの不整合を検出するのが目安です。

公式ドキュメントによれば、Java言語仕様は変換と昇格を細かく定義しています。一次情報としてはJava Language Specification Chapter 5、API仕様としてはInteger API Documentationを確認できます。

Java言語の特徴

オブジェクト指向

Javaでは、データと処理をclassにまとめ、newで作成したインスタンスを通じて操作するのがポイントです。この設計により、extendsによる継承、implementsによるインターフェース実装、overrideによる振る舞いの差し替えを扱えます。

そのため、オブジェクト型の型変換では、実体がどのクラスのインスタンスなのかが問題になります。初心者向けの段階では、変数の宣言型と実際の生成型が異なる場合に注目すると理解しやすくなるのが一般的です。

プラットフォーム独立

Javaのソースコードはjavacでバイトコードに変換され、javaコマンドでJVM上に読み込まれます。この仕組みにより、OSごとの差を吸収しながら同じロジックを動かせます。

ただし、型変換そのものは環境依存の挙動に頼らず、言語仕様として定義されたルールに従いるのが現実的です。数値の範囲、文字コード、参照型のキャスト可否を仕様ベースで読む姿勢が、Javaの安定した理解につながります。

堅牢性

JavaはNullPointerExceptionNumberFormatExceptionClassCastExceptionなどの例外を通じて、問題の箇所を明示します。型変換で失敗しやすい場面でも、例外名から原因を推測できると整理できます。

一方、数値のキャストでは例外が出ずに値が変わる場合があります。doubleからintへの変換で小数点以下が失われるようなケースは、コンパイルに成功しても意味の確認が必要になります。

マルチスレッド

JavaはThreadRunnableを使った並行処理を標準で扱えますし、ここがポイントです。型変換そのものはスレッド機能とは別の話ですが、共有データを扱う処理では値の型と範囲を明確にしておく必要があります。

このとき、AtomicIntegerlongなどを選ぶ判断にも型の知識が関係します。Javaで数値や参照を扱う基盤として、型変換の理解は広い範囲のコード読解に影響すると理解できます。

Javaが人気の理由

Javaは企業システム、Android関連技術、Webアプリケーション、バッチ処理などで長く使われています。標準API、ビルドツール、フレームワークが充実しており、学習資料も多く見つかります。

その広さの分だけ、型変換の知識はさまざまな場面で必要になると覚えるとよいでしょう。日付処理や文字列処理を学ぶ場合はJavaでうるう年を判定する記事、文字の扱いを広げる場合はJavaエスケープ処理の記事も合わせて読むと流れをつかめます。

型変換とは

型変換とは、ある型の値を別の型として扱える形に変える処理です。Javaでは、プリミティブ型どうしの変換、参照型どうしのキャスト、Stringと数値の相互変換などが代表例になります。

これを理解するには、値そのものが変わる場合と、参照の見え方だけが変わる場合を分ける必要があると考えられます。intからfloatへの変換は数値表現の変化であり、Animal型の変数をDog型に戻す処理は参照型のキャストです。

分類代表例主な記法注意点
暗黙の型変換intからlong代入のみ広い型へ移る場合が中心
明示的な型変換doubleからint(int)小数点以下や上位ビットが失われる場合あり
文字から数値charからint代入のみUnicode値として扱われる
文字列から数値StringからintInteger.parseInt()不正文字列では例外が起きる
数値から文字列intからStringInteger.toString()表示や連結に使いやすい形になる
参照型キャストAnimalからDog(Dog)実体が合わないと例外になる
安全確認ObjectからStringinstanceofキャスト前の判定に使う
独自変換StringからIntegerメソッド化業務ルールを閉じ込めやすい

この早見表の範囲を押さえると、Javaの型変換を読む入口が整理できます。初心者向けのサンプルコードでは短い例を使いますが、考え方は入力値の検証、APIの戻り値、データベースから取り出した値の扱いにもつながります。

Javaにおける型とその分類

Javaの型は、大きくプリミティブ型と参照型に分けられますが、これは押さえたい点です。プリミティブ型にはbyteshortintlongfloatdoublecharbooleanがあります。

一方、参照型にはString、配列、クラス、インターフェース、列挙型などがあります。参照型の変数は値そのものではなく、ヒープ上にあるオブジェクトへの参照を保持すると言えるでしょう。

この違いは型変換の結果にも表れます。プリミティブ型の変換ではビット幅や数値範囲が問題になり、参照型の変換では継承関係と実体のクラスが問題になります。

プリミティブ型と参照型

プリミティブ型は固定された値の範囲を持ちますし、これが一つの目安です。たとえばshort-32768から32767までを扱い、範囲外の値を単純に保持することはできません。

参照型はオブジェクトへの参照を保持するため、宣言された型と実際のインスタンス型が異なることがあります。Animal animal = new Dog();のような代入では、変数は親クラス型でも実体は子クラスです。

これらの性質を混同すると、Javaの型変換は難しく見えます。数値型では範囲と精度、参照型では継承関係とinstanceofを確認する、と分けて考えると学習しやすくなるのが基本です。

Javaの型変換の基本

Javaの型変換の基本は、暗黙の型変換と明示的な型変換の区別です。暗黙の変換はコンパイラが安全と判断できる場面で行われ、明示的な変換は開発者がキャスト演算子で意図を示します。

そのため、サンプルコードを読むときは、括弧付きの(int)(short)があるかに注目します。括弧がない代入でも変換が起きる場合があるため、代入元と代入先の型を並べて確認すると理解できるのが目安です。

暗黙の型変換

暗黙の型変換は、狭い範囲の型から広い範囲の型へ値を移すときに行われます。intからfloatcharからintのような変換では、キャスト演算子を書かなくても代入できます。

ただし、すべての変換が安全という意味ではありません。intからfloatでは大きな整数の精度に注意が必要になるため、数値の性質に応じた型選択も合わせて考えますが、覚えておくと役立つでしょう。

サンプルコード1:intからfloatへの変換

このサンプルコードでは、int型の値をfloat型の変数へ代入します。Javaが自動的に型変換するため、キャスト演算子は不要です。

public class Main {
    public static void main(String[] args) {
        int intNum = 5;
        float floatNum = intNum;  // intからfloatへの暗黙の型変換

        System.out.println("intNumの値: " + intNum);
        System.out.println("floatNumの値: " + floatNum);
    }
}

結果: 期待される出力は、intNumの値: 5floatNumの値: 5.0です。

このとき、整数の5は浮動小数点数の5.0として扱われます。初心者向けの解説では、表示上の小数点が増えるだけでなく、変数の型が変わっている点を確認します。

intNumの値: 5
floatNumの値: 5.0

結果: 期待される表示例は、元のint値と変換後のfloat値が別々の行に出る形です。

その表示例は、Javaの暗黙の型変換が代入時に働いたことを示するのがポイントです。小さなサンプルコードでも、宣言型と出力の違いを見比べると処理の流れを追えます。

サンプルコード2:charからintへの変換

charは文字を表しますが、内部的にはUnicodeコードポイントに対応する数値として扱われます。Javaではcharintへ代入すると、その数値が取り出されますし、ここを基本と考えるとよいでしょう。

public class Main {
    public static void main(String[] args) {
        char charValue = 'A';
        int intValue = charValue;  // charからintへの暗黙の型変換

        System.out.println("charValueの値: " + charValue);
        System.out.println("intValueの値: " + intValue);
    }
}

結果: 期待される出力は、charValueの値: AintValueの値: 65です。

このサンプルコードでは、文字'A'が数値65に変わります。文字列の"A"ではなく文字リテラルの'A'である点も、Javaの型変換を読むうえで区別します。

charValueの値: A
intValueの値: 65

結果: 期待される表示例は、文字そのものとUnicode値が対応して出る形です。

その対応関係が分かると、文字コードを扱う処理の読み方も安定するのが一般的です。エスケープシーケンスや特殊文字と組み合わせる場面では、Javaの文字処理に関する基礎も確認しておくと理解が進みます。

明示的な型変換

明示的な型変換は、変換先の型を括弧で書いて値の扱いを変える方法です。Javaでは(int)(short)(Dog)のように記述し、コンパイラに変換の意図を伝えます。

ただし、明示したからといって常に望む値になるわけではありません。数値型では情報の欠落、参照型ではClassCastExceptionが起きる可能性があるため、キャストは理由を持って使いるのが現実的です。

サンプルコード3:doubleからintへの変換

doubleからintへ変換すると、小数点以下は丸めではなく切り捨てられます。金額や割合の処理では、Math.round()などの丸め処理と混同しないことが大切です。

double doubleValue = 5.75;
int intValue = (int) doubleValue;
System.out.println("変換後のint値は " + intValue + " です");

結果: 期待される出力は、変換後のint値は 5 ですです。

この結果は、5.75の小数点以下が失われることを表します。解説として特に押さえたいのは、Javaのキャストが四捨五入を意味しない点です。

サンプルコード4:longからshortへの変換

longからshortへの変換は、扱える範囲が大きい型から小さい型へ絞る処理です。値がshortの範囲内なら読みやすい結果になりますが、範囲外では意図しない値になる場合があると整理できます。

long longValue = 30000L;
short shortValue = (short) longValue;
System.out.println("変換後のshort値は " + shortValue + " です");

結果: 期待される出力は、変換後のshort値は 30000 ですです。

この例では30000shortの範囲内に収まるため、そのままの数値として扱えます。ただし、40000Lのような値では範囲外になり、Javaの型変換としては別の値へ変化する可能性があります。

⚠️ 注意: 数値の明示的な型変換は、コンパイルを通すためだけに使うと不具合の原因になると理解できます。変換前にShort.MIN_VALUEShort.MAX_VALUEなどで範囲を確認すると、意図しない値の混入を防ぎやすくなります。

型変換の応用例

型変換の応用では、ユーザー入力やファイル読み込みで得たStringを数値に変える処理がよく出てきます。逆に、計算結果を画面やログへ出すために数値をStringへ変える場面もあると覚えるとよいでしょう。

そのほか、親クラスと子クラス、インターフェースと実装クラスの間で参照型を扱うキャストも欠かせません。Javaのオーバーライドと組み合わせるときは、Javaでマスターするオーバーライドの記事も関係します。

Stringと基本データ型の間の変換

Stringから数値へ変換するときは、Integer.parseInt()Long.parseLong()Double.parseDouble()などを使います。変換できない文字列ではNumberFormatExceptionが起きるため、入力値の検証と組み合わせるのが一般的です。

逆方向の変換では、Integer.toString()String.valueOf()を使えると考えられます。文字列連結の中では自動的に文字列化される場合もありますが、サンプルコードでは変換箇所を明確にすると読みやすくなります。

サンプルコード5:Stringからintへの変換

このサンプルコードでは、数字だけで構成されたStringintに変換します。初心者向けの練習では、"123"123が別の型であることを意識すると言えるでしょう。

public class Main {
    public static void main(String[] args) {
        String strNumber = "123";
        int number = Integer.parseInt(strNumber);
        System.out.println("変換後の数字: " + number);
    }
}

結果: 期待される出力は、変換後の数字: 123です。

Integer.parseInt()は、文字列を10進数の整数として解釈します。この解説の要点は、変換後のnumberが計算に使えるintになる点です。

サンプルコード6:intからStringへの変換

intからStringへの変換では、数値を表示や連結に向いた形へ変えます。ログ、HTML出力、メッセージ生成では、この方向の型変換が自然に現れますし、ここがポイントです。

public class Main {
    public static void main(String[] args) {
        int number = 123;
        String strNumber = Integer.toString(number);
        System.out.println("変換後の文字列: " + strNumber);
    }
}

結果: 期待される出力は、変換後の文字列: 123です。

この処理では、値の見た目は123のままですが型はStringへ変わります。Javaの型変換を学ぶ際は、見た目が同じでも演算できるか、連結されるかが変わる点を確認します。

オブジェクト型間の型変換

オブジェクト型間の型変換は、継承関係またはインターフェース実装関係がある型の間で行いるのが基本です。親クラス型の変数に子クラスのインスタンスを入れるアップキャストは自然に行えますが、親クラス型から子クラス型へ戻すダウンキャストには確認が必要です。

その理由は、宣言型だけでは実体のクラスが分からないためです。Animal型の変数が常にDogを指すとは限らず、別の子クラスを指していれば(Dog)のキャストは失敗します。

サンプルコード7:親クラスと子クラス間のキャスト

このサンプルコードでは、親クラスAnimalと子クラスDogを用意します。DogAnimalを継承し、sound()メソッドを上書きするのが目安です。

class Animal {
    void sound() {
        System.out.println("動物の音");
    }
}

class Dog extends Animal {
    void sound() {
        System.out.println("ワンワン");
    }
}

結果: 期待される状態は、AnimalDogのクラス定義がコンパイル可能になることです。

この定義だけでは標準出力への表示はありません。サンプルコードとしては、次の呼び出し部分と組み合わせて参照型の型変換を確認します。

Animal myAnimal = new Dog();
Dog myDog = (Dog) myAnimal;
myDog.sound(); // 出力: ワンワン

結果: 期待される出力は、ワンワンです。

myAnimalの宣言型はAnimalですが、実体はnew Dog()で作られたDogです。そのため、(Dog)によるダウンキャスト後にsound()を呼ぶと、Dog側の処理が使われます。

💡 Tips: 参照型の型変換では、変数の型だけでなく、実際に生成されたインスタンスの型を追うと判断しやすくなります。new Dog()のような生成箇所を確認すると、キャストの可否を推測できるのがポイントです。

型変換の注意点と対処法

Javaの型変換で初心者がつまずきやすいのは、コンパイルできるのに値が変わる場面と、実行時に例外が起きる場面です。数値変換ではデータ損失、参照型変換ではClassCastExceptionを分けて考えます。

具体的には、数値の範囲を確認する、文字列を数値にする前に形式を検証する、オブジェクトをキャストする前にinstanceofで判定する、といった対処が中心になります。Javaの型変換は短い記法で書けますが、変換前後の意味を確認することが欠かせません。

データ損失のリスク

データ損失は、大きな範囲や高い精度を持つ型から、狭い範囲や低い精度の型へ変換するときに起こりますが、これは押さえたい点です。doubleからintへ変換すると小数点以下が切り捨てられ、longからshortへ変換すると範囲外の値が別の値になる場合があります。

そのため、入力値がどの範囲に収まるかを先に確認する必要があります。値の意味が金額、個数、ID、割合のどれなのかによって、選ぶべき型と変換方法は変わりますし、これが一つの目安です。

サンプルコード8:範囲外の数値変換の例

このサンプルコードでは、doubleの小数値をintへ明示的に型変換します。切り捨てが起きる例として、サンプルコードの中でも特に分かりやすい形です。

public class TypeConversionExample {
    public static void main(String[] args) {
        double doubleValue = 123.456;
        int intValue = (int) doubleValue;

        System.out.println("元のdouble型の値: " + doubleValue);
        System.out.println("int型への変換後の値: " + intValue);
    }
}

結果: 期待される出力は、元のdouble型の値: 123.456int型への変換後の値: 123です。

この表示から、小数点以下の.456が失われることを読み取れます。丸めが必要な処理では、Math.round()BigDecimal、明示的な丸め規則などを検討します。

ℹ️ 補足: 金額計算ではdoubleの丸め誤差が問題になることがあるのが一般的です。厳密な小数計算が必要な場合は、Java標準APIのBigDecimalを候補にします。

ClassCastExceptionのリスク

ClassCastExceptionは、実体のクラスに合わない参照型キャストを行ったときに発生します。Javaのコンパイラが型の関係を完全に判断できない場面では、実行時に問題が表面化するのが現実的です。

このリスクを下げるには、キャスト前にinstanceofで確認します。Java 16以降ではパターンマッチングを使ったinstanceofも利用でき、判定と変数宣言をまとめて書けます。

サンプルコード9:間違ったキャストによる例外発生

このサンプルコードでは、ObjectのインスタンスをStringへキャストしようとすると整理できます。宣言型としてはObjectからStringへのキャストを書けますが、実体はStringではありません。

public class Main {
    public static void main(String[] args) {
        Object obj = new Object();
        String str = (String) obj;  // 間違ったキャスト
    }
}

結果: 期待される挙動は、実行時にClassCastExceptionが発生することです。

この例では、objが指している実体はnew Object()で作られたオブジェクトです。Stringとして扱える実体ではないため、Javaの参照型キャストとして失敗します。

Exception in thread "main" java.lang.ClassCastException: class java.lang.Object cannot be cast to class java.lang.String (java.lang.Object and java.lang.String are in module java.base of loader 'bootstrap')
    at Main.main(Main.java:4)

結果: 期待されるエラー表示例は、java.lang.Objectjava.lang.Stringへキャストできないという内容です。

このエラーは、変数名ではなく実体のクラスに注目すると読みやすくなります。エラーメッセージ内のcannot be cast toは、型変換の失敗を示す目印です。

安全に扱うには、instanceofで型を確かめてからキャストします。下の修正版では、objStringのインスタンスではない場合にメッセージを出す形にしていると理解できます。

public class Main {
    public static void main(String[] args) {
        Object obj = new Object();
        if (obj instanceof String) {
            String str = (String) obj;  // 安全なキャスト
        } else {
            System.out.println("オブジェクトはStringクラスのインスタンスではありません");
        }
    }
}

結果: 期待される出力は、オブジェクトはStringクラスのインスタンスではありませんです。

この対処により、不適切なキャストを実行する前に分岐できます。実装パターンとしてよく見るのは、APIからObject型で返る値を扱う前に、期待する型かどうかを確認する書き方です。

⚠️ 注意: instanceofは実体の型を確認するための演算子です。数値の範囲チェックや文字列の数値形式チェックとは役割が違うため、parseInt()の失敗対策にはtrycatch、または事前検証を組み合わせます。

Javaにおける型変換のカスタマイズ方法

Javaにおける型変換のカスタマイズは、独自メソッドとして変換ロジックを切り出す考え方です。言語機能として演算子のオーバーロードで変換を定義する仕組みはJavaにはないため、メソッド名と戻り値で意図を表すると覚えるとよいでしょう。

そのため、toUser()fromEntity()parse()convert()のような名前で、変換元と変換先を明確にします。初心者向けの段階では、入力チェック、null処理、戻り値の型をそろえることから始めると安全です。

カスタムキャスターの作成

カスタムキャスターは、Java標準のキャスト演算子だけでは表しにくい変換をメソッド化したものです。たとえば、文字列をその長さを表すIntegerへ変換する処理は、単純なキャストではなく独自ロジックになります。

この設計では、変換元がnullのときにどう扱うかを決めておく必要があると考えられます。戻り値としてnullを返す、例外を投げる、Optionalを使うなどの選択肢があり、呼び出し側の扱いやすさに合わせます。

サンプルコード10:独自の型変換メソッドの実装

このサンプルコードでは、Stringを受け取り、文字数をIntegerとして返すメソッドを定義します。Javaの型変換を業務ルールとして扱う場合にも、同じようにメソッドへ閉じ込める形が使えると言えるでしょう。

public class CustomCaster {

    // このメソッドでは、String型のオブジェクトを受け取り、その文字列の文字数を表すIntegerオブジェクトを返します
    public Integer stringToIntegerLength(String str) {
        if (str == null) {
            return null; // nullが渡された場合はnullを返します
        }
        return str.length(); // 文字列の長さをIntegerとして返します
    }

    public static void main(String[] args) {
        CustomCaster caster = new CustomCaster();
        String testString = "Java";
        Integer result = caster.stringToIntegerLength(testString);

        // このコードを実行すると、"Java"という文字列の長さである4がコンソールに表示されます
        System.out.println("変換後のInteger値: " + result);
    }
}

結果: 期待される出力は、変換後のInteger値: 4です。

stringToIntegerLength()は、文字列の内容を数値へ変えるのではなく、文字列の長さを数値として返します。この違いをメソッド名で表すことで、呼び出し側が変換の意味を読み取りやすくなります。

その設計は、Javaの大きなプログラムでも役立ちますが、覚えておくと役立つでしょう。たとえば画面入力のStringをドメインオブジェクトへ変える処理、CSVの列をLocalDateBigDecimalへ変える処理でも、サンプルコードと同じ考え方で解説できます。

まとめ

Javaの型変換では、暗黙の型変換、明示的な型変換、文字列と数値の変換、参照型のキャストを分けて理解します。特に初心者向けの学習では、intdoubleStringObjectclassの関係を短いサンプルコードで確認すると定着しやすくなるのが基本です。

ただし、型変換は書けることと安全であることが同じではありません。doubleからintでは小数点以下が失われ、ObjectからStringでは実体が合わないとClassCastExceptionが起きます。

そのため、数値では範囲と精度、文字列では形式、参照型では実体のクラスを確認します。Javaの型変換をサンプルコードだけでなく仕様とAPIの説明に照らして読むことで、エラーの原因を絞り込みやすくなるのが目安です。

実装で迷う場面では、キャスト演算子だけに頼らず、parseInt()toString()instanceof、独自の変換メソッドを使い分けます。この整理ができると、Javaの型変換は単なる文法ではなく、値の意味を守るための設計として扱えます。

関連記事

著者: Japanシーモア編集部

Japanシーモアは、Web/IoT/APP/SYS 分野のプログラミング情報を体系的に提供するメディアです。本記事は編集部による執筆とAI支援を組み合わせて制作し、公開前に編集部が校正しています。誤りや改善案がございましたらお問い合わせよりご連絡ください。

※本記事は実在のエンジニア複数名で構成される Japanシーモア編集部が、AI支援を活用して作成・校正・公開しています。