Дженерики Java - получают тип

Желание действительно мешает B собираться "мусор" в Вас, используют стандартные ссылки для хранения слушателей. Кроме того, когда Вы ведете списки слушателей вместо того, чтобы определить новый ArrayList< ListenerType> (); Вы могли сделать что-то как новый ArrayList< WeakReference< ListenerType> > ();

Путем обертывания объекта в weakReference можно помешать ему продлевать жизнь объекта.

Это только работает, конечно, если Вы пишете класс, который содержит слушателей

6
задан tinkertime 3 November 2009 в 20:48
поделиться

6 ответов

В отличие от других ответов, вы можете получить тип универсального параметра. Например, добавление этого к методу внутри универсального класса приведет к получению первого универсального параметра класса ( T в вашем случае):

ParameterizedType type = (ParameterizedType) getClass().getGenericSuperclass();
type.getActualTypeArguments()[0]

Я использую этот метод в универсальном Hibernate DAO, который я написал, поэтому я может получить фактический сохраняемый класс, потому что он нужен Hibernate. Работает!

15
ответ дан 8 December 2019 в 05:22
поделиться

РЕДАКТИРОВАТЬ

Оказывается, в этом случае можно получить общую информацию. Singleshot опубликовал ответ , который делает именно это. Его должен быть принятый ответ. Переквалификационная шахта.

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

Хороший FAQ по этой теме:

9
ответ дан 8 December 2019 в 05:22
поделиться

Один из способов сделать это - явно передать объект класса с типом . Примерно так:

public class FooImpl<T extends Colors> {
  private Class<T> colorClass;
  public FooImpl(T colorClass) {
    this.colorClass = colorClass;
  }
  public Class<T> getColorClass() {
    return colorClass;
  }
}
0
ответ дан 8 December 2019 в 05:22
поделиться

Есть. Посмотрите [Javadoc для java.lang.Class # getGenericInterfaces ()] ( http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Class.html#getGenericInterfaces () ) .

Вот так:

public class Test1 {

    interface GenericOne<T> {
    }

    public class Impl implements GenericOne<Long> {
    }

    public static void main(String[] argv) {
        Class c = (Class) ((ParameterizedType) Impl.class.getGenericInterfaces()[0]).getActualTypeArguments()[0];
        System.out.println(c);
    }
}
1
ответ дан 8 December 2019 в 05:22
поделиться

Зависит от того, что вы имеете в виду. Просто T может быть тем, что вам нужно, например:

public Interface Foo<T extends Colors>{ public T returnType() {...} ...}
0
ответ дан 8 December 2019 в 05:22
поделиться

[править] Хорошо, по-видимому, частично возможно. Хорошее объяснение того, как это сделать (включая улучшение метода, опубликованного SingleShot): http://www.artima.com/weblogs/viewpost.jsp?thread=208860

-2
ответ дан 8 December 2019 в 05:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: