2012-02-13 66 views
4

我有一個代碼:從一個普通的靜態方法獲取類的名字在Java中

Model.java:

public abstract class Model <T> { 
    public static <T> T find(int id) { 
    T result = (T) blackMagicMethod(T.class, id); 

    return result; 
    } 
} 

,User.java

public class User extends Model<User> { 
} 

,Main.java:

public class Main { 
    public static void main(String[] args) { 
    System.out.println(User.find(1)); 
    } 
} 

,blackMagicMethod:

public Object blackMagicMethod(Class clazz, int id) {} 

blackMagicMethod(T.class, id)不工作,像Getting the class name from a static method in Java描述的任何黑客。

我該如何讓這段代碼工作?

回答

10

通用類型的類在運行時不可用,即T.class沒有意義。

通用類型在編譯時被轉換爲Object。這就是所謂的Type Erasure

如果你確實需要的類型參數的class,你需要補充的是作爲參數:

public abstract class Model <T> { 
    public static <T> T find(Class<T> clazz, int id) { 
     T result = (T) blackMagicMethod(clazz, id); 
     return result; 
    } 
} 
+0

添加類令牌構造也沒用這裏的方法是靜態的(和通用)。你需要將它傳遞給'find'方法本身。 – 2012-02-13 15:32:04

+0

如何在靜態方法中使用實例變量? – 2012-02-13 15:32:44

+0

Ooops。答案已更新。 – aioobe 2012-02-13 15:43:22

相關問題