Я пишу процессор аннотаций, который должен генерировать код, вызывающий статический метод, такой как Collectors.toList()
(полная подпись: public static <I> Collector<I, ?, List<I>> toList()
)
Пример ввода:
class Pojo<X> {
public @CollectWith("Collectors.toList()") List<Thing<X>> things;
}
Фрагмент кода, сгенерированного сверху:
Collector<Thing<X>, ?, List<Thing<X>>> thingsCollector = Collectors.toList();
- Базовый тип возврата вызова метода всегда
Collector<T,A,R>
- Из контекста вызова код знает
R
(над ним List<Thing<X>>
)
- Тип-переменные
T
и A
(и I
) неизвестны
Кусочки головоломки
// Lookup specified Collector method
TypeElement collectors = elements.getTypeElement("java.util.stream.Collectors");
ExecutableElement toListMethod = findMethod(collectors, "toList");
DeclaredType toListMethodReturnType = (DeclaredType)toListMethod.getReturnType(); // java.util.stream.Collector<T,?,java.util.List<T>>
// R is already known.
DeclaredType R = ... // java.util.List<Thing<X>>
Q: Существует ли какой-либо код, который разрешает отсутствующие переменные типа и может вычислить DeclaredType
из thingsCollector
как Collector<Thing<X>, ?, List<Thing<X>>>
.