Как избавиться от подстановочного типа возврата с обобщениями в 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);
Другие вопросы по тегам