2012-02-23 44 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理論與實踐:泛型](http://www.ibm.com/developerworks/java/library/j-jtp01255/index.html) – 2012-02-23 16:24:45

+0

什麼是編譯錯誤說? – Thomas 2012-02-23 16:25:13

+0

您正在導入JXLabel嗎? – ewok 2012-02-23 16:27:18

回答

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

感謝您的回覆。 – 2012-02-23 16:59:07

3

在運行時無法從您的類BaseLabel中找到此信息,因爲它不知道它已通過實例化的通用類型。這是因爲Java對泛型使用了類型擦除 - 泛型參數不是運行時僞像。

+0

@matthewSpleep非常感謝您的解釋。如果我從抽象BaseClass的構造函數中調用this.getClass.getSimpleName()。它正在打印ChildClass。你能告訴我爲什麼這樣做嗎?是因爲我正在實例化ChildClass,所以它指向ChildClass的對象。 – 2012-02-23 17:02:56

+0

動態解析Java方法(使用對象的運行時類)getClass()調用仍然知道該對象最終是一個「ChildLabel」,即使代碼是在「BaseLabel」中調用的。 – matthewSpleep 2012-02-23 18:14:05

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

做的工作。