Получение имени класса из общего статического метода в Java - PullRequest
4 голосов
/ 13 февраля 2012

У меня есть код:

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) не работает, как любые хаки, описанные в Получение имени класса из статического метода в Java .

Как я могу заставить этот код работать?

1 Ответ

10 голосов
/ 13 февраля 2012

Класс универсального типа недоступен во время выполнения, т. Е. T.class не имеет смысла.

Универсальные типы переводятся в Object при компиляции. Это то, что называется Тип 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;
    }
}
...