我有一个代码:
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中描述的任何黑客一样。
如何使此代码正常工作?
答案 0 :(得分:10)
泛型类的类在运行时不可用,即T.class
没有意义。
泛型类型在编译时被转换为Object
。这就是所谓的Type Erasure。
如果您确实需要type参数的class
,则需要将其添加为参数:
public abstract class Model <T> {
public static <T> T find(Class<T> clazz, int id) {
T result = (T) blackMagicMethod(clazz, id);
return result;
}
}