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());
}
いまいちですが、よしとします。次回はジェネリックなクラスを検証する予定です。
