[Java] ジェネリクス文法(3) ジェネリックメソッド

2024/11/08に公開

ジェネリクスメソッド

クラスではなく、一般クラス内のメソッドをジェネリクス化するものである。

GenericMethod クラスの生成

<span style=color:red>特定のメソッドをジェネリクス化する</span>
メソッドのリターンタイプの前に <> ジェネリクス文法を記述します。

staticはジェネリクスメソッドを便利に使うために書かれただけで、ジェネリクスメソッドとは関係ありません!
→オブジェクトなしで実行するとすぐに実行されます。

メソッド機能の例
引数としてデータが渡され、そのデータは型が決まっていません。
このような引数を受け取り、boxに保存し、データが保存されたboxを返すメソッド。

public class GenericMethod {

   public static  <T> Box<T> makeBox (T data){
       Box<T> box = new Box<T>();
       box.setData(data);
       return box;
   }
}

戻り値の型が決まっていないということは、< T > を付けるということです!

Box < T > は Box < T > クラスの姿であり、クラスも型が決まっていません

GenericMethodTest クラスの生成

Test クラスの中で main を呼び出し、ジェネリクスメソッドを呼び出します。

ジェネリクスメソッドの呼び出し

  • ジェネリクスメソッドのデータ型はメソッド呼び出し時に指定します。
  • データ型はメソッド名の前に書きます。
  • 戻り値の型に合わせて変数を作成します!
public class GenericMethodTest {
   public static void main(String[] args) {

     Box<String> box1 =  GenericMethod.<String>makeBox("wow");
     Box<Integer> box2 = GenericMethod.<Integer>makeBox(123456789);
	System.out.println(box1.getData());
System.out.println(box2.getData());


   }
}

参考) 型は省略可能java Box<String> box1 = GenericMethod.makeBox("wow"); Box<Integer> box2 = GenericMethod.makeBox(123456789);

追加1) ジェネリクス型のパラメータを入れる練習
GenericMethodクラスの中でpeekBoxジェネリクスメソッドを生成

public static <T> void peekBox(Box<T> box){
   System.out.println(box.getData());
}

クラスでジェネリクスメソッドを呼び出して使用する!

Box<String> box = new Box<>();
 box.setData("box");
 Box<Integer> box3 = new Box<>();
 box3.setData(123);
 GenericMethod.peekBox(box);
 GenericMethod.peekBox(box3);

結果
box
123

ジェネリクスメソッドのように見えるが、そうではないのは?

追加2) 注意!

//これはジェネリクスメソットではない !
public static void peekBox2(Box<Object> box){
peekBox2には Box<String> オブジェクトが使えるか ---> 正解は NO !!!!!!!
peekBox2は Objectが 入った型だけ受け入れる 
⇒つまり、パラメーターは Box<object>じゃなきゃ行けない!!!!!!!!!!!

下を参考すれば理解しやいです。
これはリストだけできるから

//これはジェネリクスメソットではない2 !
public static void peekBox3(Box<List> box){
   System.out.println(box.getData());
}

ジェネリクスを今うまく使うということではなく、理解してこういうものがあるということです!いつか私も上手に使えるようになることが目標です😉

Discussion