Earlier quoted context omitted.
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…
This is not the case with traits/type class approach seen in Rust/Haskell.
Lifetimes suffer from the exact same problem as well, since they're really an exotic form of generic.
That said, I will readily admit that it was a lack of skill on my part. From talking to people in the Rust community though, I gather this isn't an uncommon experience.