public <StudentRequestContext> Response getResponse(...
означает, что вы объявляете StudentRequestContext
как переменную типа , для которой этот метод является общим. Это совершенно не связано с классом с именем StudentRequestContext
выше. Когда вы используете тип StudentRequestContext
внутри метода, он ссылается на эту переменную типа, объявленную для этого метода, а не на тип из класса.
Чтобы избежать путаницы, вы можете переименовать переменную типа, скажем, в U
, что полностью эквивалентно тому, что вы имели выше:
public <U> Response getResponse(
Request<U> studentRequest) {
U studentRequestContext =
(U) studentRequest.getRequestContext();
studentRequestContext.get //NO getName METHOD IS AVAILABLE
}
Видите, в чем проблема? Переменная studentRequestContext
имеет тип U
(переменная типа без границ), у которой нет метода с именем getName
.
Подпись <T> Response getResponse(Request<T> request);
означает нечто иное, чем вы, вероятно, намеревались. Сигнатура <T> Response getResponse(Request<T> request);
означает, что метод реализации должен принимать аргумент типа Request
из любого параметра типа (вместо этого можно эквивалентно записать сигнатуру как Response getResponse(Request<?> request);
).
Вероятно, вам нужно сделать интерфейс универсальным, и его метод getResponse
может принимать аргумент типа Request
определенного параметра типа, такой же, как параметр типа самого ResponseGenerator
:
public interface ResponseGenerator<T> {
Response getResponse(Request<T> request);
}
Тогда ваш класс StudentResponseGenerator
может реализовать этот интерфейс, используя определенный тип в качестве параметра типа:
public class StudentResponseGenerator implements ResponseGenerator<StudentRequestContext> {
@Override
public Response getResponse(Request<StudentRequestContext> studentRequest) {
// ...
}
}