ジェネリック: Java vs C#

JavaC#ジェネリクスの違いについてまとめようと思ったが、既に詳細にまとめているサイトがあったので、そちらを参考にさせて頂くことにした。

ジェネリック: Java vs C#

結構違うものなのだな。
特にメソッドにおける型パラメタの位置の違いは、恥ずかしながら昨日初めて知ったのだ。

//Java 
public  void method(T t) { } 

//C# 
public void Method(T t) { } 

C#に慣れていたので同じ書き方をJavaでもしていたのだが、どうりでコンパイラが怒る訳だ。


あと、Javaの場合以下のように型パラメタのスタティックフィールドを記述することは許されない。

class MyClass {
    static T staticField;
}

Javaジェネリクス型は完全にパラメタライズされていない証だが、これが出来ないのは結構痛い。

更によくあるパターンとして型パラメタで指定した型のインスタンスを生成するメソッドを実装する際に、C#ならば

//C#
static T GetInstance()
{
    Type type = typeof(T); 
    return Activator.CreateInstance(type) as T;

    //又は以下のようにジェネリクスに対応したメソッド一発でもOK
    return Activator.CreateInstance();
}

このように書けるが、Javaの場合は実行時にパラメタの型情報を扱うことができないので、以下のようにパラメタを使う必要がある。

//Java
public static  T GetInstance(Class clazz) throws InstantiationException, IllegalAccessException {
    return (T)clazz.newInstance();
}

せっかくジェネリクスにしたのにメソッドのパラメタで型を指定しなければならないのはスマートではないよな。(もっとスマートな書き方ができるのかもしれない)
このように掘り下げると今度はC#ジェネリクスの方が正統で好きになってくる。(昨日のことはもう忘れた)