変数のデータ型を変換する – 型キャスト
(type)var
type:データ型
var:変数名
データ型を変換することを型キャストと言います。
まず、基本型では、小さな型を大きな型に代入(たとえば、int型の値をlong型に代入)することは可能です。大は小を兼ねるのです。これを拡大変換と言います。
しかし、その逆(縮小変換)はそのままでは不可です。long型の値がint型に格納できるとは限らないからです。
そこで、明示的にlong型の値をint型にキャスト(変換)する必要があります。キャストには、対象の変数の直前に「(型名)」を付与するだけです。
- package com.example.mynavi.basic;
- public class Cast {
- public static void main(String[] args) {
- long l = 50;
- int i = (int)l;
- System.out.println(1+i);// 結果:51
- }
- }
同じく、クラス型/インターフェイス型の値もキャストできます。クラス型/インターフェイス型がキャストできるのは、代入する型が代入先の型の派生型、または実装型でなければなりません。たとえば、HamsterクラスがAnimalクラスaのサブクラスであれば、以下のようなキャストが可能です。
- Animal a = new Hamster();
- Hamster h = (Hamster)a;
ただし、以下のようなコードは不可です。
- Animal c = new Cat();
- Hamster h = (Hamster)c; // キャストエラー
変数cはAnimal型ですが、その実体はCatオブジェクトであるからです。
このようなエラーを防ぐためには、instanceof演算子を利用してください。instanceof演算子は、オブジェクトが指定されたクラス、またはスーパークラスのインスタンスであるかを判定します。クラス型のキャストにあたっては、あらかじめinstanceof演算子で実際の型を判定しておくことで、安全にキャストを実行できます。
- Animal c = new Cat();
- if (c instanceof Hamster) {
- Hamster h = (Hamster)c;
- }
なお、Java 16以降ではinstanceof演算子の拡張構文が導入され、型判定と型キャストとを同時に実行できるようになりました。たとえば上のコードは、以下のように書き換えが可能です。
- if (c instanceof Hamster ★h★) {
- ...キャストに成功した場合の処理...
- }
instanceof演算子による判定式の末尾に、キャスト後の変数を指定するだけです。
監修