Получить конкретное значение универсального параметра при обработке аннотации

У меня есть:

class Base<E> {
  E e;
  abstract void f(E other);
}

class Ext extends Base<String> {
  // HERE
}

Я хотел бы создать реализацию f(E other) в Ext, но не могу понять, как сообщить генератору, что E является String в этом классе. Базовые классы также могут быть интерфейсами. У меня JCClassDecl, поэтому я могу проверить decl.type.extending и implementing, но просмотр этого руководства быстро превращается в беспорядок, и то, что у меня сейчас есть, не работает повсеместно, поэтому я бы хотел пропустить публикацию неправильного кода и задать вопрос в его текущем , общий вид.


person tkroman    schedule 29.02.2016    source источник


Ответы (1)


Ах, я понял. Потратил день на поиски ответа, а затем, задав вопрос, потребовалось около 30 минут, чтобы понять его.

Ответ: Types#memberType:

getTypes().memberType(
  classDecl.sym.type,                // this is the extending JCClassDecl
  varDecl.vartype.type.tsym          // this is the parameter JCVarDecl
)

Поскольку javac API довольно сложен для понимания, я надеюсь, что это кому-то поможет.

person tkroman    schedule 29.02.2016