Как работает downcast в java
Я не могу никак понять как работает downcast в java. Я знаю что он работает в тех случаях, когда мы имеем дело изначально с upcast объектом. Типа если B extends A :
A myA = new B();
B myB = (B) myA; // такой даун каст прокатит.
Но я не могу понять как работают даун касты в подобных случаях когда мы имеем дело с классами из стандартных библиотек. Вот пример:
URL conn = new URL("https://www.google.com/");
URLConnection myConect = conn.openConnection();
HttpURLConnection http =(HttpURLConnection) myConect; // Почему такое разрешается?
Подобное возможно потому что это базовые библиотеки или что? Метод openConnection() изначально возвращает URLConnection, поэтому объяснить это изначальным upcastom я не могу. Тогда почему это работает. В книги Шилдта когда я читал про Number, там было написано, что так как класс является convertible можно делать вещи типа:
Number n = 1; // хотя я так думаю это возможно из-за динамической обертки. Наверное по факту это выглядеть как Number n = new Integer
Integer nnn = (Integer) n;
Понятно. В классе URLConnection почему такое возможно? Короче, я запутался, господа. Если кто может доходчиво объяснить, буду благодарен. Если можно обьяснение именно на примере класса URLConnection