1) public class Dog <T extends Animal> {...
В вашем классе Dog будет универсальный тип, который наследует переменные и методы из класса (возможно, абстрактный класс Animal). Этот T должен иметь и свойство animal. Например, предположим, что у вас есть класс Mammalian.Мы знаем, что все млекопитающие являются животными, поэтому у них есть то, что есть у всех животных, и они могут то, что могут все животные.
Итак, вы можете назвать это как
public Dog<Mammalian> myDog = ...
Существует другая ситуация.
2) public class Buldog extends Dog<DogFood, DogCommands> {....
Таким образом, ваш класс собаки должен быть написан как
/** T refers the food, and K refers commands*/
public class Dog<T,K> {....
Так что, если вы хотите расширить свой класс с помощью Bulldog, вы можете оставить универсальные или указать эти универсальные типы ..
3) public class Buldog<T extends DogFood, K extends DogCommands> extends Animal implements LivingBeign, LivingThing<T,K> { ....
Это также просто, как приведенные выше коды.Разница в том, что вам нужен подкласс DogFood, который может быть любым, это может быть Pap, Milk или Meat, а также некоторый подкласс DogCommands, например SitCommand, PlayCommand. И когда вы создаете Buldog, вы знаете, что это Animal, поэтомувы не хотите снова писать свойства и методы animal, и поскольку в Java вы не можете использовать множественное наследование, вам нужны и другие методы интерфейса в вашем классе.
Надеюсь, теперь это более понятно.