Не знаю, если это поможет, но когда вы создаете подкласс (включая анонимно) универсальный тип, информация о типе доступна через отражение. например.,
public abstract class Foo<E> {
public E instance;
public Foo() throws Exception {
instance = ((Class)((ParameterizedType)this.getClass().
getGenericSuperclass()).getActualTypeArguments()[0]).newInstance();
...
}
}
Итак, когда вы создаете подкласс Foo, вы получаете экземпляр Bar, например,
// notice that this in anonymous subclass of Foo
assert( new Foo<Bar>() {}.instance instanceof Bar );
Но это много работы и работает только для подклассов. Хотя может быть удобно.