public class UpdateDetails<REQ extends ReferenceRequest> extends ExecuteStep<Context, REQ> {
}
The syntax just feels very odd to me. I am not even sure what exactlty REQ is. I do not see that used anywhere else in the class.
REQ is a generic type parameter.
It doesn't have to be used in the UpdateDetails class. It is passed to the ExecuteStep super class, which might use it.
Suppose SomeReferenceRequest is a class that implements or extends ReferenceRequest.
You can instantiate your class with:
UpdateDetails<SomeReferenceRequest> details = new UpdateDetails<> ();
The super class ExecuteStep might have methods that return REQ or have REQ argument[s], or it might have instance variables of type REQ.
UpdateDetails: The name of your class REQ: generic name for the class that UpdateDetails will process. Similar to when you write ArrayList you will build UpdateDetails. Someclass will need to extend the class ReferenceRequest.
ReferenceRequest: UpdateDetails can use any object that extends ReferenceRequest.
ExecuteStep: UpdateDetails will need to extend the class ExecuteStep, that will process two objects, Context and REQ.
You can learn more about generics here: https://docs.oracle.com/javase/tutorial/java/generics/