こんにちは。受託開発担当(ここでは雑記担当)のMasaです。

Java5 が登場してすぐに仕事で使用する機会があったのですが、当時は Generics に感動しました。
その後、C#3.0 での開発を経験し、最近また Java6 で開発しているのですが。。。

Java で一番困ったことは

    T instance = new T();    

とか

    if (T instanceof MyObject) {
    } 

とかできないことです。 C#3.0 はできたのになぁ。とりあえず検証してみます。

まずは C# です。とりあえず適当なクラスを作成します。

public class MyObject
{
    public MyObject() { }
}

public class MyObject1 : MyObject
{
    public MyObject1() : base() { }
}

public class MyObject2 : MyObject
{
    public MyObject2() : base() { }
}

public class Test
{
    static void Main(string[] args)
    {
        Test test = new Test();
    }
}

Test クラスに検証用に MyObject クラスから派生されたクラスの型を指定し、インスタンスを取得するメソッドを追加します。

public T Create<T>() where T : MyObject, new()
{
    if (typeof(T) == typeof(MyObject1))
        Console.WriteLine("MyObject1です。");

    if (typeof(T) == typeof(MyObject2))
        Console.WriteLine("MyObject2です。");

    return new T();
}

実行してみます。

static void Main(string[] args)
{
    Test test = new Test();
    Console.WriteLine(test.Create<MyObject1>().GetType());
    Console.WriteLine(test.Create<MyObject2>().GetType());
}

ce382b3e383b3e382bde383bce383ab1
難なく実行できました。

長くなってきたので Java の検証は次回ということで。。。