Javapoet суперкласс универсальный

Кто-нибудь знает, как я могу сделать следующее с помощью javapoet

public class MyClassGenerated extends MyMapper<OtherClass>{

}

Мой код поколения:

TypeSpec generateClass() {
    return classBuilder("MyClassGenerated")
         .addModifiers(PUBLIC)
         .superclass(???????????????)
         .build();
}

1 ответ

Решение

ParameterizedTypeName Класс позволяет указать аргументы универсального типа при объявлении суперкласса. Например, если ваш MyClassGenerated класс является подклассом MyMapper класс, вы можете установить параметр общего типа MyMapper вот так:

TypeSpec classSpec = classBuilder("MyClassGenerated")
     .addModifiers(PUBLIC)
     .superclass(ParameterizedTypeName.get(ClassName.get(MyMapper.class),  
                                           ClassName.get(OtherClass.class)))
     .build();

Это создаст TypeSpec объект, эквивалентный следующему классу:

public class MyClassGenerated extends MyMapper<OtherClass> { }

Хотя это и не указано в вопросе, обратите внимание, что вы можете установить любое количество аргументов универсального типа, просто добавив их в правильном порядке к ParameterizedTypeName.get вызов:

ParameterizedTypeName.get( 
    ClassName.get(SuperClass.class),
    ClassName.get(TypeArgumentA.class),
    ClassName.get(TypeArgumentB.class),
    ClassName.get(TypeArgumentC.class)
); // equivalent to SuperClass<TypeArgumentA, TypeArgumentB, TypeArgumentC>

Для получения дополнительной информации о ParameterizedTypeName.get() метод, смотрите здесь документацию или раздел "$T для типов" на странице GitHub JavaPoet.

Другие вопросы по тегам