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());
}

javae382b3e383b3e382bde383bce383ab1
実行できました。

いまいちですが、よしとします。次回はジェネリックなクラスを検証する予定です。