Consider the following snippets:
class SpineWarmCollection <T extends Vertebrate & Warmblooded> { }
class Mammal extends Vertebrate implements Warmblooded {}
class Bird extends Vertebrate implements Warmblooded {}
class Reptile extends Vertebrate {}
SpineWarmCollection<Mammal> mammalCollection = new SpineWarmCollection<>();
SpineWarmCollection<Bird> birdCollection = new SpineWarmCollection<>();
SpineWarmCollection<Reptile> reptileCollection = new SpineWarmCollection<>();
Vertebrate is a class in animal taxonomy; however, warm-bloodedness is a trait. There is not a single ancestral class for warm-bloodedness, since both mammals and birds are of a warm-blooded nature, but their common ancestor, vertebrate, is not.
Since T can only be a class that applies to vertebrates and warm-blooded, the general can access any methods declared in vertebrates and warm-blooded.
You don’t even need a class. T can expand only interfaces, which would allow using generic for any sets of classes that implement interfaces, even from those sets of classes that are completely unrelated to each other.