2024.10.09

引数の型キャスト

はじめに

ここでは、メソッド引数に違うデータ型変数を指定する方法を説明します。

例えば、呼びたいメソッド引数int型で、引数として使いたい変数long型の場合、どのように記述すればメソッドが呼び出せるかを説明しています。

以下のソースコードは、addメソッド引数aとbにlong型引数を使っています。

この場合、コンパイルエラーが出力されて実行できません。

	private static int add( int a, int b )
	{
		return a + b;
	}


	public static void main( String[] args ) {
		long a = 10;
		long b = 20;

		// long型の変数でメソッドを呼び出すとコンパイルエラーになる
		int ans = add( a, b );
			:

    }

ここからは、メソッドの仕様は変更せずに、呼び出す側の記述方法でコンパイルに成功させる方法を説明していきます。

型の違いでコンパイルエラー

以下のJavaソースコードは、addメソッド引数int型で、呼び出しに使っている変数long型の例です。

TypeCasting4.java

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
// このソースコードはコンパイルに失敗します。
public class TypeCasting4 {
	// int型のaとbを足した結果を戻すメソッド
	private static int add( int a, int b )
	{
		return a + b;
	}

	// メインメソッド
	public static void main( String[] args ) {
		// long型の変数に値を代入
		long a = 10;
		long b = 20;

		// long型の変数aとbでaddメソッドを呼び出す
		int ans = add( a, b );	// ここでコンパイルエラー

		// 結果を出力
		System.out.println( ans );
	}
}

このソースコードは、コンパイルに失敗するので実行できません。

TypeCasting4.java:16: エラー: 不適合な型: 精度が失われる可能性があるlongからintへの変換
                int ans = add( a, b );  // ここでコンパイルエラー

この場合は、情報量の多い変数型(long)から情報量のが少ない変数型(int)に変換しているのと同じことなので、上のメッセージが出力されてコンパイルに失敗します。

情報量の少ない変数型から情報量のが多い変数型の変換であればコンパイルに成功します。

以下のソースコードを参考にしてください。addメソッド引数short型を使っています。

TypeCasting3.java

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
public class TypeCasting3 {
	// int型のaとbを足した結果を戻すメソッド
	private static int add( int a, int b )
	{
		return a + b;
	}

	// メインメソッド
	public static void main( String[] args ) {
		// short型の変数に値を代入
		short a = 10;
		short b = 20;

		// short型の変数aとbでaddメソッドを呼び出す
		int ans = add( a, b );

		// 結果を出力
		System.out.println( ans );
	}
}

addメソッドに渡す引数short型なのでコンパイルに成功します。short型の方が、int型より情報量が少ないからです。

型を変更しコンパイルを成功させる

それでは、ここからコンパイルを成功させる方法について説明します。

コンパイルを成功させるためには、型キャストを使ってメソッド引数と同じ型に変換します。

情報量に関係なく同じ型に変換すればコンパイルに成功します。

以下のメソッドをいろいろな型の変数で呼び出す場合、

	private static int add( int a, int b )
	{
		return a + b;
	}

呼び出す変数の前に「(int)」を付けるとコンパイルに成功します。

long型の変数の場合

		long a = 10;
		long b = 20;

		int ans = add(  (int)a,  (int)b );

float型の変数の場合

		float a = 10.5f;
		float b = 20.5f;

		int ans = add(  (int)a,  (int)b );

double型の変数の場合

		double a = 10.5;
		double b = 20.5;

		int ans = add(  (int)a,  (int)b );

この方法は、コンパイルに成功しますが、正しい結果が得られるかどうかはプログラムの仕様しだいです。

例えば、上記のfloat型double型の例ですが、addメソッドはaとbを足した結果を戻すメソッドなので「31」が戻ってほしいところですが、実際には「30」が戻ります。、

double型のa=10.5をint型型キャストするとa=10になり、同様にb=20となります。小数点以下は切り捨てになるからです。

addメソッド引数に「10と「20」を渡したことになるので、「30」が戻ってきます。

他にも、long型の値がint型の値を超える場合も正確な値が戻ってきません。以下の値の範囲を参考にしてください。

型名 分類 情報量 値の範囲
int 符号付き整数型 32bit -2147483648(-215) ? 2147483647(215-1)
long 符号付き整数型 64bit -9223372036854775808(-231) ? 9223372036854775807(231-1)

Javaのソースコード

型キャストしてメソッドを呼び出すJavaソースコードの例です。

long型をint型にキャストするソースコード例

TypeCasting5.java

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
public class TypeCasting5 {
	// int型のaとbを足した結果を戻すメソッド
	private static int add( int a, int b )
	{
		return a + b;
	}

	// メインメソッド
	public static void main( String[] args ) {
		// long型の変数に値を代入
		long a = 10;
		long b = 20;

		// int型にキャストしたlong型の変数aとbでaddメソッドを呼び出す
		int ans = add(  (int)a,  (int)b );

		// 結果を出力
		System.out.println( ans );
	}
}

実行結果

30

float型をint型にキャストするソースコード例

TypeCasting6.java

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
public class TypeCasting6 {
	// int型のaとbを足した結果を戻すメソッド
	private static int add( int a, int b )
	{
		return a + b;
	}

	// メインメソッド
	public static void main( String[] args ) {
		// float型の変数に値を代入
		float a = 10.5f;
		float b = 20.5f;

		// int型にキャストしたfloat型の変数aとbでaddメソッドを呼び出す
		int ans = add(  (int)a,  (int)b );

		// 結果を出力
		System.out.println( ans );
	}
}

実行結果

30

double型をint型にキャストするソースコード例

TypeCasting7.java

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
public class TypeCasting7 {
	// int型のaとbを足した結果を戻すメソッド
	private static int add( int a, int b )
	{
		return a + b;
	}

	// メインメソッド
	public static void main( String[] args ) {
		// double型の変数に値を代入
		double a = 10.5;
		double b = 20.5;

		// int型にキャストしたdouble型の変数aとbでaddメソッドを呼び出す
		int ans = add(  (int)a,  (int)b );

		// 結果を出力
		System.out.println( ans );
	}
}

実行結果

30

以上です。

関連コンテンツ

データの型を変換する方法を詳しく解説しています。例)int型 → long型

2015.11.01

プログラミングで使う変数って何?

2020.03.23

基本的な計算である足し算(加法)/引き算(減法)/掛け算(乗法)/割り算(除法)を行うプログラム作成。

2020.03.23

メソッドの定義方法を詳しく解説しています。Javaのサンプルソースコードを使った説明もあります。

2020.03.23

Javaを使った簡単な応用プログラム(生年月日から年齢を計算プログラムなど)を紹介しています。

2022.07.07

Javaの学習に役立つソースコードを多数紹介しています。是非、ご覧ください。

2022.09.10

画像フォーマット形式・色・大きさ・傾きなどの変更、特定の図形(文字・記号など)を見つけたり、取り出したりする画像処理について詳しく解説。

2015.11.29

メソッドを抜けるときに使用するreturn文について説明しています。

2020.03.20

変数やクラスに格納されている値をコンソール出力する方法は?

2020.03.23

プログラムの最初に実行されるメソッドは?

2022.12.13

Javaのプログラムを書いてみませんか?プログラムの書き方をくわしく説明しています。

2020.03.23

「Javaソースコード」から実行可能な「オブジェクトコード」に変換する方法をくわしく説明しています。

2020.03.23

Javaのプログラムを作ってみませんか?プログラミングに必要なものの用意から実行までを説明しています。

2020.03.23

Swingパッケージを使ってグラフィック表示を行う方法を解説しています。

2020.03.23

繰り返し処理を使ったJavaのソースコードサンプルを紹介しています。

2020.03.23

配列を使うJavaソースコードを多数紹介しています。

2021.05.18

数学に関係するJavaのメソッドやソースコードなどを紹介しています。

2022.10.25

三角形、台形、円などいろいろな図形の面積を計算するプログラムを紹介しています。詳しくは、記事をご覧ください。

2021.05.18

StringクラスとStringBuilderクラスを利用したプログラミングの仕方を紹介しています。

2016.12.16

プログラミング、ITに関する用語をまとめています。

2022.10.17

日本で使われてきた伝統文様「和柄」について解説しています。

2022.07.27

Javaで扱うデータ型について説明しています。

2020.03.23

プログラミング言語とは?種類や特徴について説明しています。

2022.08.03

「ゆるゆるプログラム」のコンテンツを紹介しています。興味のある方はこの記事をご覧ください。

2020.03.23

広告