Не имеет смысла иметь обработчик, использующий дженерики, если вы вызываете handle для каждого объекта.
Либо вы создаете экземпляр обработчика для типа, подобного этому:
public class Handler<T>{
int required;
Handler<?> next;
public void handle(T O){
...
}
}
или вы определяете обработчик абстрактного класса и позволяете конкретному подклассу обрабатывать определенный тип или просто передавать событие в цепочку.
Также используя
if( x.isInstance(o)) {...}
действительно антипаттерн, и вы можете нарушать правила ООП.