Если возвращаемый класс должен быть универсальным (Bar<T> extends Foo<T>
или еще много чего), то я вполне уверен, что это невозможно, поскольку (из-за стирания) система типов не может проверить во время выполнения, если класс, который Class.forName(...)
вернул, является Class<Bar<T>>
, а не Class<Bar<U>>
или чем-то еще. (На самом деле существует только один Class
объект, представляющий все Bar<...>
типы, но система типов не имеет представления для этого, поэтому она делает вид, что Class<Bar<T>>
и Class<Bar<U>>
- это совершенно отдельные объекты с разными типами.) Самое близкое, что вы можете получить, это что-то вроде этого:
<T> Class<? extends Iterable<T>> createClassObject
(final String className, final Class<T> clazz) throws Exception
{ return Class.forName(className).asSubclass(getIterableTClass(clazz)); }
@SuppressWarnings("unchecked")
<T> Class<? extends Iterable<T>> getIterableTClass(final Class<T> clazz)
{ return (Class<? extends Iterable<T>>)(Class<?>)Iterable.class; }
, где вы используете непроверенное приведение, чтобы заставить компилятор думать, что у него достаточно информации о Foo<T>
(в данном случае Iterable<T>
) для проверки asSubclass
.
Однако, если возвращаемый класс не должен быть универсальным (Bar extends Foo<String>
или еще много чего), то я не уверен; Я никогда не имел дело с частями рефлексии, которые занимаются этим, хотя я знаю, что они существуют. Я почти уверен, что они позволят вам изучить достаточно иерархии наследования Bar
, чтобы определить, действительно ли она расширяет Foo<String>
, но я действительно не знаю, дадут ли они вам способ сделать компилятор знайте, что вы сделали это.