2012-02-23 12 views
3

私は、一般的な基本クラスを持っている:ジェネリッククラス - のgetClass()のgetName()

public class BaseLabel<T> extends JXLabel { 
    private static final long serialVersionUID = 1L; 

    public BaseLabel() { 
     System.out.println(T.class.getClass().getName()); //error 
    }  
} 

と子クラス:

public class ChildLabel extends BaseLabel<ChildLabel> { 
    private static final long serialVersionUID = 2L; 

    public ChildLabel() { 

    }  
} 

私はコンパイルエラーを取得しています。

BaseClassのコンストラクタから実際のクラス名を取得する方法はありますか。ここでは、実際のクラスで私はインスタンス化しようとしているクラスを参照しています。

たとえば、私はChildClassをインスタンス化しています。ChildClass clz = new ChildClass();

println()package.ChildClassと表示されます。

ありがとうございます。


コンパイルエラーは次のとおりです。

cannot select from a type variable System.out.println(T.class.getClass().getSimpleName()); 

私はabstract BaseClassのコンストラクタからthis.getClass.getSimpleName()を呼び出した場合。 ChildClassを印刷しています。

なぜですか?

ChildClassをインスタンス化しているので、これはChildClassのオブジェクトを指しています。

+3

コンパイル時に利用できない情報を求めているので、私が知る限り、あなたがしようとしていることは不可能です。しかし、実行時でさえ、この情報を得るためにJavaの一般的な制限にぶつかるでしょう。この記事、特にジェネリックスとタイプ消去に関する部分を読んでください。[Java理論と実践:Generics gotchas](http://www.ibm.com/developerworks/java/library/j-jtp01255/index.html) –

+0

コンパイルエラーは言う? – Thomas

+0

JXLabelをインポートしていますか? – ewok

答えて

7

醜いですか?はい

import java.lang.reflect.ParameterizedType; 


public class GenericClass<T> { 

    public GenericClass() { 
     System.out.println(getClass().getGenericSuperclass()); //output: GenericClass<Foo> 
     System.out.println(((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0]); //output: class Foo 
    } 

    public static void main(String[] args) { 
     new ChildClass(); 
    } 

} 

子クラス

import java.lang.reflect.ParameterizedType; 


public class ChildClass extends GenericClass<Foo> { 

    public ChildClass() { 
     System.out.println(((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]); //output: class Foo 
    } 

} 
+0

ご返信ありがとうございます。 –

3

実行時にクラスBaseLabelからこの情報を見つけることができません。これは、一般的な型がインスタンス化されたことを「認識」していません。これは、Javaがジェネリックにタイプ消去を使用するためです。ジェネリックパラメータは実行時アーチファクトではありません。

+0

@matthewSpleep説明ありがとうございました。抽象BaseClassのコンストラクタからthis.getClass.getSimpleName()を呼び出した場合。 ChildClassを印刷しています。なぜこのように行動しているのか教えていただけますか?これはChildClassをインスタンス化しているので、これがChildClassのオブジェクトを指しているためですか? –

+0

Javaメソッドは動的に解決されます(オブジェクトのランタイムクラスを使用)、コードが 'BaseLabel'で呼び出されても、オブジェクトが最終的に' ChildLabel'であることがgetClass()呼び出しによって分かります。 – matthewSpleep

0
((Class<?>)((ParameterizedType) clazz.getGenericSuperclass()).getActualTypeArguments()[0]).getName(); 

仕事をしてくれました。

関連する問題