Короткий раствор литья:
MyPage page = (MyPage)pages.get(1);
Обратите внимание, что это требует, чтобы рассматриваемый объект действительно типа MyPage
- в противном случае литье заканчивается с ClassCastException
. Если вы не уверены в этом, вы можете проверить тип объекта: первый
Page elem = pages.get(1);
if (elem instanceof MyPage) {
MyPage page = (MyPage)elem;
...
}
Однако необходимость делать такие downcasts часто является признаком, что ваш дизайн класс может быть улучшен. Если
aForeignObject.getAllPages()
всегда возвращает список объектов
MyPage
, вы должны соответствующим образом изменить его тип возврата. В противном случае, если
newFunction
имеет смысл в интерфейсе
Page
(даже как абстрактное или с пустой реализацией по умолчанию), вы должны рассмотреть возможность его добавления; то вы можете позвонить
newFunction
прямо на
Page
ссылки, не требуя понижения.
Update: так что вы на самом деле есть Page
объекты, которые вы хотите преобразовать в MyPage
объектов ... Техническое решение это было бы преобразующий конструктор:
class MyPage extends Page {
MyPage(Page other) {
// deep copy internal state
}
...
}
Хотя технически это я бы все еще пересмотрел проектный подход, который требует таких решений, если это возможно. Если вы используете сторонний код, который вы не можете изменить, это не вариант.
@ Программисты C++: Является ли это то, что мы можем сделать с 'dynamic_cast'? –
@Martijn - Нет, динамический прилив будет только повышать преобразование, если класс относится к типу (или подтипу) класса, в который вы конвертируете. –