2012-02-13 31 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

相关问题