От собаки к животному - это классические случаи наследования, полиморфии, а не общие. Прямо там с формой / кругом / сферой. Это должно быть DogEntity : AnimalEntity
и AnimalEntity : BaseEntity
. Эта цепочка наследования действительно не имеет смысла.
Вся суть дженериков в том, что вы можете ввести практически любой тип и при этом иметь время компиляции проверки типов. Вам никогда не придется проверять типы, компилятор сделает это за вас.
Если вы когда-нибудь задумывались о типах с универсальными шаблонами с вероятностью 90%, у вас нет сценария универсальных шаблонов. Скорее всего, вы изобретаете переопределение заново. Я вижу, что люди часто тяготеют к генерикам + проверкам типов по ошибке, тогда как обычная старая полиморфия / переопределение будет ответом. Вероятно, это один из наиболее распространенных примеров проблемы XY в наши дни.