Java Generics & Reflection - PullRequest
       6

Java Generics & Reflection

1 голос
/ 22 апреля 2011

это, вероятно, основной вопрос, но могу ли я сделать что-то вроде этого:

Class myClass = Class.forName("Integer");
SomethingSimple<myClass> obj;

Где SomethingSimple - очень простой универсальный класс:

class SomethingSimple<T>
{
    T value;
    SomethingSimple() {}
    public void setT(T val)
    {
        value = val;
    }
    public T getT()
    {
        return value;
    }
}

Очевидно, что приведенный выше код неверен, так как myClass является объектом типа Class, и требуется класс.Вопрос в том, как этого достичь.Я читал другие темы об Обобщении Отражений, но они касались того, как универсальный класс знает тип.

Ответы [ 3 ]

5 голосов
/ 22 апреля 2011

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

3 голосов
/ 22 апреля 2011

Обобщения в Java используются только для статической проверки типов во время компиляции; общая информация отбрасывается после проверки типа (читайте о стирании типов ), поэтому SomethingSimple<Foo> - это всего лишь SomethingSimple<Object> во время выполнения.

Естественно, вы не можете выполнять проверку типов во время полного завершения для типа, который неизвестен до времени выполнения. Тип должен быть известен компилятору, поэтому вы должны использовать фактическое имя типа, а не переменную Class в качестве параметра универсального типа.

2 голосов
/ 22 апреля 2011

Generics - это механизм времени компиляции для обеспечения безопасности типов, а отражение - это механизм времени выполнения. Вы говорите: «Я не знаю во время компиляции, что это за тип T, но я хочу, чтобы безопасность типов во время компиляции» (что не имеет особого смысла). Иными словами, java стирает тип T во время выполнения и сохраняет его как объект ... так что тип T (насколько это касается генериков) больше не имеет значения.

Но на самом деле кажется, что вам нужен контейнер для инъекций зависимостей, такой как spring или google облик.

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