Желание действительно мешает B собираться "мусор" в Вас, используют стандартные ссылки для хранения слушателей. Кроме того, когда Вы ведете списки слушателей вместо того, чтобы определить новый ArrayList< ListenerType> (); Вы могли сделать что-то как новый ArrayList< WeakReference< ListenerType> > ();
Путем обертывания объекта в weakReference можно помешать ему продлевать жизнь объекта.
Это только работает, конечно, если Вы пишете класс, который содержит слушателей
В отличие от других ответов, вы можете получить тип универсального параметра. Например, добавление этого к методу внутри универсального класса приведет к получению первого универсального параметра класса ( T
в вашем случае):
ParameterizedType type = (ParameterizedType) getClass().getGenericSuperclass();
type.getActualTypeArguments()[0]
Я использую этот метод в универсальном Hibernate DAO, который я написал, поэтому я может получить фактический сохраняемый класс, потому что он нужен Hibernate. Работает!
РЕДАКТИРОВАТЬ
Оказывается, в этом случае можно получить общую информацию. Singleshot опубликовал ответ , который делает именно это. Его должен быть принятый ответ. Переквалификационная шахта.
В целом, однако, во многих случаях вы не можете получить информацию о типе, которую могли бы ожидать. Java использует метод, называемый стиранием типа, который удаляет типы из универсального во время компиляции. Это предотвращает получение информации об их фактическом связывании во время выполнения во многих сценариях.
Хороший FAQ по этой теме:
Один из способов сделать это - явно передать объект класса с типом . Примерно так:
public class FooImpl<T extends Colors> {
private Class<T> colorClass;
public FooImpl(T colorClass) {
this.colorClass = colorClass;
}
public Class<T> getColorClass() {
return colorClass;
}
}
Есть. Посмотрите [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);
}
}
Зависит от того, что вы имеете в виду.
Просто T
может быть тем, что вам нужно, например:
public Interface Foo<T extends Colors>{ public T returnType() {...} ...}
[править] Хорошо, по-видимому, частично возможно. Хорошее объяснение того, как это сделать (включая улучшение метода, опубликованного SingleShot): http://www.artima.com/weblogs/viewpost.jsp?thread=208860