2009-10-15 47 views
3

什麼是檢索泛型參數的運行值泛型類的最佳途徑檢索泛型參數值?例如:的Java:在運行時

public class MyClass<T> { 

    public void printT() { 
    // print the class of T, something like: 
    // System.out.println(T.class.getName()); 
    } 

} 

所以,如果我叫

new MyClass<String>().printT() 

它會打印 「字符串」

+0

爲什麼這很重要? 如果真的不重要,請使用實際的類型。 – 2009-10-15 09:39:01

回答

6

你不知道。由於type erasure信息(大部分)在運行時丟失。如果你真的需要這個課程,你可以這樣做:

public class MyClass<T> { 
    private final Class<T> clazz; 

    public MyClass(Class<T> c) { 
    if (c == null) { 
     throw new NullPointerException("class cannot be null"); 
    } 
    clazz = c; 
    } 

    public void printT() { 
    System.out.println(clazz.getName()); 
    } 
} 

然後你有權限訪問它。

+0

注意:您的示例代碼包含一些錯誤,如'private final clazz;' - 您忘記了該變量的類型。 – Jesper 2009-10-15 08:49:38

1

要做到這一點,你需要添加的類型信息,因爲類型擦除意味着T的類型不可用。

public class MyClass<T> { 
    private final Class<T> clazz; 
    public MyClass(Class<T> clazz) { 
    this.clazz=clazz; 
    } 

    public void printT() { 
    // print the class of T, something like: 
    System.out.println(this.clazz); 
    } 
} 
1

由於type erasure,Java在運行時沒有這些信息。當實例化對象時,您需要將類型作爲構造函數參數傳遞給類。還有一些圖書館和語言,它可以幫助你做到這一點用更少的打字:Guice can do itScala can do it

0

正如前面提到的,你不能獲得的,因爲類型擦除的那個例子類型的信息。

然而,你可以重新設計你的類層次結構,以便有一個通用的超類/接口,讓子類在他們的定義直接定義類型參數:

package com; 
import java.lang.reflect.ParameterizedType; 
import java.util.Arrays; 

public class AAA { 
    public static void main(String[] args) throws Exception { 
     Object target = new MyClass<Integer>() {}; // child class that explicitly defines superclass type parameter is declared here 
     ParameterizedType type = (ParameterizedType) target.getClass().getGenericSuperclass(); 
     System.out.println(Arrays.toString(type.getActualTypeArguments())); 
    } 
} 

class MyClass<T> { 
}