木. 1月 23rd, 2025

ジェネリクスの基本

Javaのジェネリクスは、クラスやインターフェース、メソッドを定義する際に型をパラメータとして持つことができる機能です。これにより、型安全性を保ちつつコードの再利用性を高めることが可能になります。

ジェネリクスを使用することで、以下のようなメリットがあります:

  1. 型安全性: コンパイル時に型の正しさをチェックでき、実行時エラーを防ぐことができます。
  2. 再利用性: 同じコードを異なる型で再利用できます。例えば、List<String>List<Integer>など、異なる型のリストを作成することができます。

ジェネリクスの基本的な構文は以下の通りです:

class ClassName<T1, T2, ..., Tn> { /* ... */ }

ここで、T1, T2, …, Tnは型パラメータです。これらは実際の型名(例えばStringInteger)に置き換えられます。また、ClassNameは任意のクラス名を表します。

例えば、次のようにジェネリクスを使用してクラスを定義することができます:

class Box<T> {
    private T t;

    public void set(T t) { this.t = t; }
    public T get() { return t; }
}

このBoxクラスは、任意の型Tのオブジェクトを保持できます。setメソッドでオブジェクトを設定し、getメソッドでそれを取得することができます。このように、ジェネリクスを使用すると、一つのクラスやメソッドが様々な型に対応でき、コードの再利用性が向上します。また、コンパイラが型の正しさをチェックするため、型安全性も確保されます。これが、Javaのジェネリクスの基本的な使い方となります。次のセクションでは、メソッドとジェネリクスについて詳しく見ていきましょう。

メソッドとジェネリクス

Javaでは、メソッドもジェネリクスを使用することができます。これにより、メソッドが様々な型の引数を取ることができ、その結果、メソッドの再利用性が向上します。

ジェネリクスメソッドの基本的な構文は以下の通りです:

public <T> void methodName(T param) { /* ... */ }

ここで、<T>は型パラメータを表し、Tはその型パラメータを表します。methodNameは任意のメソッド名を表します。

例えば、次のようにジェネリクスを使用してメソッドを定義することができます:

public <T> void printArray(T[] array) {
    for (T element : array) {
        System.out.println(element);
    }
}

このprintArrayメソッドは、任意の型Tの配列を引数に取り、その要素を出力します。このように、ジェネリクスを使用すると、一つのメソッドが様々な型に対応でき、コードの再利用性が向上します。また、コンパイラが型の正しさをチェックするため、型安全性も確保されます。

なお、ジェネリクスメソッドは、ジェネリクスクラス内だけでなく、非ジェネリクスクラス内でも定義することができます。これにより、ジェネリクスメソッドの利用範囲が広がります。

以上が、Javaのメソッドとジェネリクスについての基本的な説明です。次のセクションでは、ジェネリクス引数の活用について詳しく見ていきましょう。

ジェネリクス引数の活用

Javaのジェネリクス引数は、メソッドの引数として型パラメータを使用することを可能にします。これにより、メソッドが様々な型の引数を取ることができ、その結果、メソッドの再利用性が向上します。

ジェネリクス引数の基本的な構文は以下の通りです:

public <T> void methodName(T param) { /* ... */ }

ここで、<T>は型パラメータを表し、Tはその型パラメータを表します。methodNameは任意のメソッド名を表します。

例えば、次のようにジェネリクス引数を使用してメソッドを定義することができます:

public <T> void print(T param) {
    System.out.println(param);
}

このprintメソッドは、任意の型Tの引数を取り、その引数を出力します。このように、ジェネリクス引数を使用すると、一つのメソッドが様々な型の引数に対応でき、コードの再利用性が向上します。また、コンパイラが型の正しさをチェックするため、型安全性も確保されます。

なお、ジェネリクス引数は、ジェネリクスクラス内だけでなく、非ジェネリクスクラス内でも定義することができます。これにより、ジェネリクス引数の利用範囲が広がります。

以上が、Javaのジェネリクス引数の活用についての基本的な説明です。次のセクションでは、実践的な例とコードについて詳しく見ていきましょう。

実践的な例とコード

Javaのジェネリクスを活用した実践的な例として、異なる型のリストをソートするメソッドを考えてみましょう。このメソッドは、Comparableインターフェースを実装した任意の型のリストを引数に取ります。

以下に、そのコードを示します:

import java.util.*;

public class Main {
    public static <T extends Comparable<T>> void sortList(List<T> list) {
        Collections.sort(list);
    }

    public static void main(String[] args) {
        List<Integer> intList = Arrays.asList(3, 1, 4, 1, 5, 9);
        sortList(intList);
        System.out.println(intList);  // Output: [1, 1, 3, 4, 5, 9]

        List<String> strList = Arrays.asList("Java", "Python", "C++", "Ruby");
        sortList(strList);
        System.out.println(strList);  // Output: [C++, Java, Python, Ruby]
    }
}

このsortListメソッドは、Comparableインターフェースを実装した任意の型Tのリストを引数に取り、そのリストをソートします。<T extends Comparable<T>>という記述により、TComparableインターフェースを実装した型でなければならないことが指定されています。これにより、Collections.sort(list)によるソートが可能となります。

mainメソッドでは、Integer型のリストとString型のリストを作成し、それぞれをsortListメソッドでソートしています。このように、ジェネリクスを使用すると、一つのメソッドが様々な型の引数に対応でき、コードの再利用性が向上します。また、コンパイラが型の正しさをチェックするため、型安全性も確保されます。

以上が、Javaのジェネリクスの実践的な例とコードについての説明です。この記事が、Javaのジェネリクスについての理解とその活用に役立つことを願っています。最後まで読んでいただき、ありがとうございました。

By jakoten

コメントを残す

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