再帰的ジェネリクスサンプル備忘録

再帰的ジェネリクスをサクッと使ったサンプルプログラムを思いついたのでメモ。

参考
ジェネリックな設計 再帰編

やること

Classに問い合わせて自分自身のクラス名を取得するメソッドを作ってみる。


パラメタライズ前

public class SampleProgram {

	public static void main(String[] args) {
		
		FooClass foo = new FooClass();
		foo.showMyName();
	}
	
    /* ====================== 以下、ネストクラス ====================== */
	public static class FooClass {
		@SuppressWarnings("unchecked")
		public void showMyName() {

			final Class<FooClass> clazz = (Class<FooClass>) getClass();

			System.out.println("このクラスの名前は ★" + clazz.getSimpleName() + "★ です。");		
		}
	}
}
>
このクラスの名前は ★FooClass★ です。


パラメタライズ後

public class SampleProgram {

	public static void main(String[] args) {
		
		IClass<FooClass> foo = new FooClass();
		IClass<BarClass> bar = new BarClass();
		
		foo.showMyName();
		bar.showMyName();
	}
	
    /* ====================== 以下、ネストクラス ====================== */
	public interface IClass<T extends IClass<T>> {
		@SuppressWarnings("unchecked")
		default void showMyName() {
			
			final Class<T> clazz = (Class<T>) getClass();
			
			System.out.println("このクラスの名前は ★" + clazz.getSimpleName() + "★ です。");
		}
	}

	// IClassのパラメータ T に継承クラス型をバインドしてやる
	public static class FooClass implements IClass<FooClass> {}
	public static class BarClass implements IClass<BarClass> {}
}
>
このクラスの名前は ★FooClass★ です。
このクラスの名前は ★BarClass★ です。

再帰的ジェネリクスってこういう時に使うんだなあと、とても腑に落ちた。

  • パラメタライズ前のコードで自分自身の型を利用してキャストしていた部分を再帰的ジェネリクスでパラメータ化する

  • あとは継承を利用して型バインドさせるだけ


この記事が気に入ったらサポートをしてみませんか?