Объясните, пожалуйста, сужение и расширение типов (не примитив)

Плохо понимаю вот такие конструкции

public static void main(String[] args)
{
  Object obj = new Tiger();
  Animal animal = (Animal) obj;
  Cat cat = (Cat) obj;
  Tiger tiger = (Tiger) animal;
  Tiger tiger2 = (Tiger) cat;
}

Ответы (1 шт):

Автор решения: Z.John

Object obj = new Tiger(); поскольку все объектные типы унаследованы от Object, вы всегда можете использовать такую конструкцию, но на практике мало встречается.

Animal animal = (Animal) obj; явное приведение типа, используется довольно часто - например у вас есть Map, вы знаете, что под определенным ключом у вас находится объект типа Animal, и хотите использовать его методы для обработки, тогда вы и выполняете яное приведение типа (Animal)obj. Перед явным приведением типа, чтоб избежать ошибки, выполняют проверку какого типа объект, выглядит это так

 if( obj instanceof Animal ){
     Animal animal = (Animal)obj;
 }

но это сработает только если ваш объект является непосредственно экземпляром класса Animal. Если ваш объект например Cat extends Animal, то проверка instanceof даст вам false. Тогда надо использовать другой способ проверки

 if( Animal.class.isAssignableFrom(obj.getClass()) ){
     Animal animal = (Animal)obj;
 }
→ Ссылка