2012-02-13 5 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'. –

+0

Как я могу использовать переменную экземпляра в статическом методе? –

+0

Ooops. Ответ обновлен. – aioobe

Смежные вопросы