Как найти объект класса универсального типа Java? - PullRequest
3 голосов
/ 28 мая 2010

Предположим, у меня есть общий тип P, который является Enum, то есть <P extends Enum<P>>, и я хочу получить значение Enum из строки, например:

String foo = "foo";
P fooEnum = Enum.valueOf(P.class, foo);

Это приведет к ошибке компиляции, поскольку P.class недопустимо. Итак, что я могу сделать, чтобы заставить работать приведенный выше код?

Ответы [ 4 ]

4 голосов
/ 28 мая 2010

У вас должен быть где-то экземпляр времени выполнения этого универсального типа, чтобы вы могли просто получить декларирующий класс на Enum#getDeclaringClass(). Предполагая, что вы объявили P p где-то как аргумент метода, вот пример.

1007 * Е.Г. *

public static <P extends Enum<P>> P valueOf(P p, String name) {
    return Enum.valueOf(p.getDeclaringClass(), name);
}
3 голосов
/ 28 мая 2010

В Java нет пути. Универсальные типы стираются и преобразуются в Object в байтовом коде. Универсальный тип (в вашем случае 'P') - это не реальный класс, а просто заполнитель.

Посмотрите на этот вопрос с отличными ответами на удаление типа.

1 голос
/ 28 мая 2010

Java реализует дженерики, используя так называемое стирание типов. Это означает, что фактический общий параметр стирается во время выполнения. Таким образом, вы не можете вывести информацию о типе из параметров универсального типа.

0 голосов
/ 28 мая 2010

Вы можете получить его во время выполнения, позвонив вызывающему или некоторому провайдеру конфигурации.Например, вы можете настроить Spring или что-либо еще для этого.

class Converter<P extends Enum> {
    private Class<P> type;

    //setter and getter

    public P valueOf(String name) {
        return Enum.valueOf(type, name);
    }
}

И затем настроить его там, где это необходимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...