Hatena::ブログ(Diary)

akimatter このページをアンテナに追加 RSSフィード

2006-03-05

Genericsの実行時型情報

| 17:48 |  Genericsの実行時型情報を含むブックマーク  Genericsの実行時型情報のブックマークコメント

Java Genericsの総称型はコンパイル時にのみ解釈され、バイトコードには総称型であったという痕跡すら残りません。

仕様的に残さないことになっているため、実行時に総称型オブジェクトの型パラメータを知る方法はありません。

Genericsの罠 再び ?? ありえるえりあ

Java5で型パラメータを使ったクラス中で、パラメータとして渡されたクラスによって振る舞いを変えようとか思ってたら、渡されたクラスが取れない。調べてたら上のブログを見つけました。そうか、できないのねん・・・・何か凄くやりきれない感じがする。これだったらGenericsをあまり使わないほうが良い気がしてきた。

以下、参考までに調べ始めの時に書いたテストケースです。

package test.jdk5.generics;

import java.lang.reflect.Type;
import java.lang.reflect.TypeVariable;
import java.util.Date;

import junit.framework.TestCase;

public class ParameterizedTypeRuntimeTest extends TestCase {

    public static class ParameterizedRef<T> {

        public ParameterizedRef(T obj) {
            this.obj = obj;
        }

        public final T obj;
    }

    public void testParameterizedRef() {
        final ParameterizedRef<Date> ref = new ParameterizedRef<Date>(
                new Date());
        // 宣言されているクラスのクラス名チェック
        assertEquals(this.getClass().getName() + "$ParameterizedRef",
                ParameterizedRef.class.getName());
        // 宣言されているクラスと、オブジェクトのクラスが一致するかどうかをチェック
        assertEquals(ParameterizedRef.class, ref.getClass());
        //
        // 何だかよく分かんないけど、parameterizationに関係しているっぽい名前なので取得。
        final TypeVariable<Class<ParameterizedRef>>[] typeParameters = ParameterizedRef.class
                .getTypeParameters();
        // 予想通り長さが1の配列で、その中身はパラメータ
        assertEquals(1, typeParameters.length);
        assertEquals("T", typeParameters[0].getName());
        //
        // うーん、この辺よくわからん。
        final Type[] bounds = typeParameters[0].getBounds();
        assertEquals(1, bounds.length);
        assertEquals(Class.class, bounds[0].getClass());
        //
        //どうやったら、refオブジェクトから、Dateクラスをゲットできるの???
    }
}

kontonkonton 2006/03/13 23:46 はじめまして。同じ内容に悩んでいる人をはじめて見つたのでコメント。
取得は可能っぽいですよ。

Genericsの罠 再び — ありえるえりあ
http://dev.ariel-networks.com/Members/anaka/generics306e7f60-518d/view

ここではで紹介されているのはFieldに総称型が使われている場合の取得方法ですが、これができるのであればClassでもきっと取れるはずです。一緒に見つけましょう。

kontonkonton 2006/03/14 00:05 すみません。ボーっとしてて貼り間違えました(笑
こっちです

IBM : developerWorks : Site maintenance
http://www-128.ibm.com/developerworks/library/j-cwt11085.html

akmakm 2006/03/14 11:00 情報ありがとうございます。Generic reflectionsのところを読むと、イケそうな雰囲気で書いてありますね。今晩にでも調べてみます。

トラックバック - http://d.hatena.ne.jp/akm/20060305
最近読んだ本
  • 情熱プログラマー ソフトウェア開発者の幸せな生き方
  • 禁煙セラピー
  • 入門git
  • 入門Git
  • もやしもん(8) (イブニングKC)
  • JRuby 徹底入門
  • 入門Subversion―Windows/Linux対応
  • Ship It! ソフトウェアプロジェクト 成功のための達人式ガイドブック
  • プログラミングRuby 第2版 言語編
  • プログラミングRuby 第2版 ライブラリ編