In reply to uvmsd:
The uvm_event_pool is a construct useful for horizontal synchronization between different agents. If you are in the same agent you can simply use uvm_event.
With respect to your questions.
ev.trigger(req);
accepts as argument any uvm_object, like a seq_item because it is extended from uvm_object.
ev.wait_trigger();
$cast(req, ev.get_trigger_data());
get_trigger returns an object of uvm_object and we have to cast this to our seq_item type.