ジェネリックのクラスとメソッド


//この例ではClassSampleクラス名に続けて「<T>」を記述しています。
//この「<T>」を記述することで、データ型の指定がObject型からT型(型変数)に変更されます。

import java.util.*;

class ClassSample<a>{
    private a t;

    public ClassSample(a t){
        this.t = t;
    }

    public a getT(){
        return t;
    }
}



public class Main {

    //ジェネリックメソッド
    private static <T> T getT(T t){
        return t;
    }


    public static void main(String[] args) throws Exception {
        // Your code here!

         // String型として利用可能 <a型がストリング型に置き換わるイメージ>
        ClassSample<String> cs1 = new ClassSample<String>("Hello");
        String str = cs1.getT();
        System.out.println(str);

        // Integer型として利用可能
        ClassSample<Integer> cs2 = new ClassSample<Integer>(1);
        Integer i = cs2.getT();
        System.out.println(i);


         // ワイルドカードを使用 Number型として利用可能
        ClassSample<? extends Number> cs3;
        cs3 = cs2;
        Number n = cs3.getT();
        System.out.println(n);

        // ワイルドカードを使用 Object型として利用可能上記の逆
        ClassSample<Number> cs4 = new ClassSample<Number>(1);
        ClassSample<? super Integer> cs5;
        cs5 = cs4;
        Object o = cs5.getT();
        System.out.println(o);

        // ジェネリックメソッドの実行 なんでも引数OK
        //ジェネリクスはメソッドに対しても使用することができます。
        //メソッドを定義する際に戻り値の型名であるTの前に「<T>」句を記述する必要があります。
        //こちらもサンプルコードでみていきましょう
        String str = getT("Hello");
        System.out.println(str);

        Integer i = getT(1);
        System.out.println(i);



    }
}