Generics are great when you need them, but they will cut you badly if you misuse them.
Generics are viral. When you make something generic, you often have to make the things that touch or contain it generic, too.
Generics also create tight coupling. When you change the definition of a generic interface/class, you'll need to update your usage across the codebase. As opposed to, say, adding a new field to a class, that can be safely ignored anywhere it isn't used.
When this component you're updating is highly connected to other parts of your code, perhaps add another generic parameter to it, it completely explodes and you have to jump all around your codebase adding generics.
The kicker is that you may be updating components which are themselves generic and highly connected, setting off secondary explosions. Pretty soon you're throwing that codebase out, starting over, and swearing to yourself that you'll never touch generics again.
My advice is to assume generics are a premature abstraction until you've exhausted what you can do with more concrete approaches.