Intereting Posts
Android Studio – Импорт библиотеки Simple-Xml Можно ли преобразовать Spannable в String в android, чтобы загрузить ExpandableListView? IllegalArgumentException: Неизвестный URL-адрес: // CONTENT Как показать макет, перемещающийся слева направо с низкой скоростью Android Swipe Отключение нескольких элементов для RecyclerView Android: HorizontalScrollView smoothScroll время анимации Установите максимальную ширину ImageView как процент от ее родительской ширины Android – вспышка вспышки камеры в неправильных интервалах на разных устройствах Можно ли получить список принтеров Bluetooth в Android? Запуск простых тестов JUnit на Android Studio (IntelliJ) при использовании конфигурации на основе Gradle Желательно ли использовать Activity.onAttachFragment или Fragment.onAttach для связи между Activity и вложенным фрагментом? Android: RecyclerView в вертикальном представлении Как превратить объем в max программно на Android? Как программно устанавливать / редактировать содержимое веб-просмотра Преобразовать строку Date в timestamp в Android?

Выделение объекта из родительского класса в дочерний

У меня есть недоразумение в отношении typecasting на языке Java. Проблема заключается в ClassCastException . Например, в этом коде, предполагая, что Animal является родительским классом класса Dog,

  Животное животное = новое животное (); 
Собака собака = (Собака) животное;

Бросает ClassCastException после выполнения. Однако, изучая пакеты android, я нашел пример о typecasting , который должен вызывать ClassCastException , учитывая этот пример java.

  EditText editText = (EditText) findViewById (R.id.edit_message); 

В этом коде метод findViewById возвращает объект класса View , который является одним из суперклассов класса EditText . ( From android.view.View to android.widget.EditText ) Код работает нормально. Может ли кто-нибудь объяснить, допустил ли я ошибку или как это происходит?

Заранее спасибо.

После создания объекта вы не можете изменить его тип. Вот почему вы не можете бросить животных на собаку.

Однако, если вы создадите объект подкласса, вы можете сохранить ссылку на него в переменной типа суперкласса, а позже вы можете применить его к типу подкласса.

Это будет работать:

 Animal a = new Dog (); Dog d = (Dog) a; 

В примере Android у вас есть ресурс макета, который выглядит так:

 <EditText android:id="@+id/edit_message" ..."/> 

Это определение заставит Android создать экземпляр EditText , и поэтому вы можете отобразить представление, возвращаемое findViewById в EditText . Вы не можете отнести его ко всему, что не является EditText .

В принципе, вы не можете отличить экземпляр суперкласса к подклассу, потому что экземпляр подкласса еще не известен. Upcasting – верный способ предотвратить это исключение, потому что теперь мы имеем дело с полиморфизмом нашего кода.

Прежде всего необходимо указать подкласс:

 Dog dog = new Dog; 

Мы можем скрыть методы класса Dog, не найденные его родительским классом Animal, отбросив его на свой суперкласс:

 Animal animal = (Animal) dog; 

Затем вы можете перетащить это обратно в свой подкласс Dog, потому что экземпляр его подкласса уже известен:

 Dog anotherDog = (Dog) animal;