Rainbow Engine

IT技術を分かりやすく簡潔にまとめることによる学習の効率化、また日常の気付きを記録に残すことを目指します。

Java

Javaの型とは?ジェネリクスの基本や使い方をご紹介

投稿日:2021年1月5日 更新日:

<目次>

(1) Javaの型とは?ジェネリクスの基本や使い方をご紹介
 (1-1) <T>とは?ジェネリクスとは?
 (1-2) ジェネリクスを使う利点
 (1-3) ジェネリクスをクラスやメソッドで使用する方法
 (1-4) サンプルプログラム

(1) Javaの型とは?ジェネリクスの基本や使い方をご紹介

(1-1) <T>とは?ジェネリクスとは?

<T>は「ジェネリクス」と呼ばれる、汎用的なクラスやメソッドの定義に使われる機能を表す記述の事で、「型パラメータ」と呼ばれています。JDK 5.0より導入されました。

宣言時点ではデータ型は<T>と未確定で、インスタンス化やメソッドに与えた引数を「型」が判断されて決まります。これを使う事で、1つのクラスやメソッドの宣言で、様々な「型」で利用する事ができます。
(図111)

目次にもどる

(1-2) ジェネリクスを使う利点

主に次に示す目的で使用します。

①共通的なクラスやメソッド定義
複数のデータ型で使える「共通的なクラスやメソッド」を作る事ができます。

②複数データ型対応のソートメソッド
具体的な利用シーンとして、例えば「Arrayをソートするためのメソッド」を作り、様々な型(StringやIntegerやDoubleなど)でソートを利用する等が考えられます。
 
③品質の向上
コンパイル時に誤ったデータ型によるインスタンス化/メソッド実行を検知できます。
 
次の節では「クラス」と「メソッド」でGenericsを使う例を見たいと思います。

 
目次にもどる

(1-3) ジェネリクスをクラスやメソッドで使用する方法

まずは「クラス」でGenericsを使用する方法をご紹介します。

■構文:ジェネリクスによるクラスの宣言
クラス名の後に<T>を付けて宣言します。

class [クラス名]<T> {
  //[クラスの定義]
}

 

■構文:ジェネリクスによるクラスをインスタンス化
例では<String>の記述により、このインスタンス内の<T>ではString型の引数のみが代入できるように限定しています。

[クラス名]<[データ型]> [インスタンス名] = new [クラス名]<[データ型]>();

//(例)
Car<String> cname = new Car<String>();

 

■構文:ジェネリクスによるメソッド定義
通常、データ型(intやString)を記述する「戻り値の型」や「引数の型」で「T」を使います。

public T [メソッド名](T [引数名]) {
 //[メソッドの処理]
}
 
(お作法)
①「型パラメータ」は<>で囲んで<T>のように書きます。
②「型パラメータ」Tにはプリミティブ型は指定できません(「int」や「double」や「char」等)
③「型パラメータ」は複数個を指定する事ができ、その場合はカンマで区切ります。
 

(1-4) サンプルプログラム

最後に上記を動く形で一連のプログラムにしたものをご紹介します。

このサンプルでは「Car」というジェネリクスのクラスを定義し、それをStringやIntegerやDoubleなど様々な型で利用しています。Stringで利用する場合は「車の名前」を保持する目的で使い、Integerで利用する場合は「車の価格」を保持する目的で使い、Doubleで利用する場合は「車重」を保持する目的でインスタンス化しています。

(サンプルプログラム)

//Genericsによるクラスをテストするためのドライバークラス
public class IT02xx_GenericsTest {
  public static void main(String args[]) {
    //Genericsによるクラスのインスタンス化

    //(1)String型でインスタンス化
    Car<String> cname = new Car<String>();
    // 上記でStringを指定しているため、setTメソッドの引数はString型を与えます。
    String carname = cname.setT("○○号");
    System.out.println("Car name is "+carname);

    //(2)Integer型でインスタンス化
    Car<Integer> cprice = new Car<Integer>();
    // 上記でIntegerを指定しているため、setTメソッドの引数はInteger型を与えます。
    Integer carprice = cprice.setT(2500000);
    System.out.println("Car price is "+carprice+" 円です");

    //(3)Double型でインスタンス化
    Car<Double> cweight = new Car<Double>();
    // 上記でDoubleを指定しているため、setTメソッドの引数はDouble型を与えます。
    Double carweight = cweight.setT(1625.65);
    System.out.println("Car weight is "+carweight+" kgです");
  }
}
//Genericsによるクラス定義
class Car<T> {
  //インスタンス変数(staticなし)を型パラメータを使い宣言
  private T car;
  //Genericsによるメソッド定義(セッターメソッド)
  public T setT(T car) {
    this.car = car;
    return this.car;
  }
}

(図141)実行結果

目次にもどる 

Adsense審査用広告コード


Adsense審査用広告コード


-Java

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

JDBCドライバとは?概要や使い方をご紹介

<目次> (1) JDBCドライバとは?概要や使い方をご紹介  (1-1) JDBC及びJDBCドライバとは?   (1-1) JDBC API   (1-2) JDBCドライバマネージャー   (1 …

EARファイル・WARファイル・JARファイルの違いや特徴について

  <目次> (1) EARファイル・WARファイル・JARファイルの違いや特徴について  (1-1) JARファイルとは(.jar)  (1-2) WARファイル(.war)  (1-3) …

オープンアドレス法のアルゴリズムについて図を使ってご紹介

<目次> (1) オープンアドレス法のアルゴリズムについて図を使ってご紹介  (1-1) オープンアドレス法とは?  (1-2) オープンアドレス法のアルゴリズム  (1-3) オープンアドレス法の利 …

JSP/Servletで画面毎のアクセスカウンターを作成してみた(パート2:ソース解説編)

(1) 仕様について (2) ソースコード  (2-1) AccessCounter2.java   (2-1-1) サンプルPG   (2-1-2) サンプルPG解説  (2-2) DbConnec …

JavaのArrrayListとLinkedListの違いについて

<目次> (1) JavaのArrrayListとLinkedListの違いについて  (1-1) 比較表(ArrayList vs LinkedList)  (1-2) まとめ  (1-3) 参考 …

  • English (United States)
  • 日本語
Top