Как избавиться от подстановочного типа возврата с обобщениями в Java?
Вот код, который использует Javassist для генерации классов на лету.
public class ClassGenerator {
// ...
public Class<? extends Base> generateClass(MetaData md) {
// Call javassist api and returns a generated on the fly class...
}
}
Далее в коде есть
public class GeneratorClient implements IClient<Base> {
private Class<Base> clazz;
public void init() {
MetaData myMd = ...;
clazz = generator.generateClass(myMd);
// ...
}
public Base getClazz() {
return clazz;
}
}
public interface IClient<T extends Base> {
T getClazz();
}
Очевидно, компилятор выдает здесь ошибку. Кастинг вызывает предупреждение ("Непроверенный актерский состав...")...
Подавить предупреждение не вариант.
Я не могу написать это также: public class GeneratorClient implements IClient<? extends Base>
,
Как я могу изменить тип возврата ClassGenerator#generateClass
?
JDK 6
1 ответ
Решение
Измени свой GeneratorClient
заявление к этому:
public class GeneratorClient<T extends Base>
implements IClient<T>
{
private final Class<T> clazz;
// etc
Это должно сделать это.
РЕДАКТИРОВАТЬ Так как вы знаете класс только во время выполнения, добавьте статический метод фабрики для создания GeneratorClient
:
public static <T extends Base> GeneratorClient<T> forClass(final Class<T>)
{
return new GeneratorClient<T>(whatever, args, are, needed, if, any);
}
В коде:
final GeneratorClient<MyClass> = GeneratorClient.forClass(MyClass.class);