C#3.0でジェネリックスを使用していた人がJava6でジェネリックスを使用すると...(2)
こんにちは。受託開発担当(ここでは雑記担当)のMasaです。
前回は C# で検証したので、今回は Java で検証します。
C# と同様に適当なクラスを作成します。
public class MyObject { public MyObject() { } } public class MyObject1 extends MyObject { public MyObject1() { } } public class MyObject2 extends MyObject { public MyObject2() { } } public class Test { public static void main(String[] args) throws Exception { Test test = new Test(); } }
C# と同様に Test クラスに MyObject クラスから派生されたクラスの型を指定し、インスタンスを取得する検証用のメソッドを追加したいのですが。。。ものすごい勢いでコンパイラから突っ込みが入ります。
public <T extends MyObject> T create() { if (T == MyObject1.class) // ← エラー System.out.println("MyObject1です。"); if (T == MyObject2.class) // ← エラー System.out.println("MyObject2です。"); return new T(); // ← エラー }
インスタンスの生成は、Class.newInstance( ) で対応するしかなさそうです。しょうがないので引数で渡します。
//public <T extends MyObject> T create() public <T extends MyObject> T create(Class<T> t) throws Exception { T instance = t.newInstance(); //if (T == MyObject1.class) if (instance instanceof MyObject1) System.out.println("MyObject1です。"); //if (T == MyObject2.class) if (instance instanceof MyObject2) System.out.println("MyObject2です。"); //return new T(); return instance; }
微妙なメソッドの完成です。何はともあれ、実行してみます。
public static void main(String[] args) throws Exception { Test test = new Test(); System.out.println(test.create(MyObject1.class).getClass().getName()); System.out.println(test.create(MyObject2.class).getClass().getName()); }
いまいちですが、よしとします。次回はジェネリックなクラスを検証する予定です。