注目記事

【Javaコード入門】基本文法_④型キャスト

変数のデータ型を変換する – 型キャスト

(type)var
 type:データ型
 var:変数名

データ型を変換することを型キャストと言います。
まず、基本型では、小さな型を大きな型に代入(たとえば、int型の値をlong型に代入)することは可能です。大は小を兼ねるのです。これを拡大変換と言います。
しかし、その逆(縮小変換)はそのままでは不可です。long型の値がint型に格納できるとは限らないからです。
そこで、明示的にlong型の値をint型にキャスト(変換)する必要があります。キャストには、対象の変数の直前に「(型名)」を付与するだけです。

Cast.java
  1. package com.example.mynavi.basic;
  2.  
  3. public class Cast {
  4.   public static void main(String[] args) {
  5.     long l = 50;
  6.     int i = (int)l;
  7.     System.out.println(1+i);// 結果:51
  8.   }
  9. }

同じく、クラス型/インターフェイス型の値もキャストできます。クラス型/インターフェイス型がキャストできるのは、代入する型が代入先の型の派生型、または実装型でなければなりません。たとえば、HamsterクラスがAnimalクラスaのサブクラスであれば、以下のようなキャストが可能です。

  1. Animal a = new Hamster();
  2. Hamster h = (Hamster)a;

ただし、以下のようなコードは不可です。

  1. Animal c = new Cat();
  2. Hamster h = (Hamster)c; // キャストエラー

変数cはAnimal型ですが、その実体はCatオブジェクトであるからです。
このようなエラーを防ぐためには、instanceof演算子を利用してください。instanceof演算子は、オブジェクトが指定されたクラス、またはスーパークラスのインスタンスであるかを判定します。クラス型のキャストにあたっては、あらかじめinstanceof演算子で実際の型を判定しておくことで、安全にキャストを実行できます。

  1. Animal c = new Cat();
  2. if (c instanceof Hamster) {
  3.   Hamster h = (Hamster)c;
  4. }

なお、Java 16以降ではinstanceof演算子の拡張構文が導入され、型判定と型キャストとを同時に実行できるようになりました。たとえば上のコードは、以下のように書き換えが可能です。

  1. if (c instanceof Hamster ★h★) {
  2. ...キャストに成功した場合の処理...
  3. }

instanceof演算子による判定式の末尾に、キャスト後の変数を指定するだけです。

基本文法_目次
変数を宣言する
定数を宣言する – finalキーワード
データ型
型キャスト
演算子
コメント

監修

山田祥寛(有限会社 WINGSプロジェクト)
静岡県榛原町生まれ。一橋大学経済学部卒業後、NEC にてシステム企画業務に携わるが、2003年 4 月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト(https://wings.msn.to/)」の代表でもある。主な著書に『改訂 3 版JavaScript 本格入門』(技術評論社)、「独習シリーズ(C#・Python・PHP・Ruby・JSP&サーブレットなど)」(翔泳社)、「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravel など)」(Amazon Kindle)など。売り上げの累計は100万部を超える。