Динамическое Кастинг: - PullRequest
       21

Динамическое Кастинг:

0 голосов
/ 24 ноября 2010

Кажется, это так очевидно. Как я могу привести объект myObjet к типу myObjet.getClass? Я пробовал комбинации forName (), cast и других ... ни одна из них не работает: s

Проблема в том, что у меня есть список объектов, и я хотел бы вернуть их к исходному типу (который задается myObjet.getClass.getName ()).

С уважением, Тим


Да, это Java, и это, конечно, не так. Позвольте мне объяснить проблему. Представьте себе программу, которая имеет дело с простыми формами, такими как квадраты и круги, которые являются производными классов от Form, основного класса.

Итак, есть функция поиска, которая возвращает форму, но вы должны указать тип и ссылку на форму (например, число):

Form myForm= searchForm(String formType, String formRef)

Я знаю, какой будет форма, которую она возвращает, потому что я передал эти аргументы функции поиска: например, квадрат. Возвращенный объект по-прежнему будет Form, но я хочу, чтобы он принадлежал классу Square, поэтому мне нужно привести его. Он совместим, поскольку Square наследует от Form.

Единственная проблема заключается в том, что formType является переменной, она может быть действительно квадратной, но также может быть и Circle. Вот почему мне нужно общее приведение для возвращаемого объекта.

Если я делаю myForm.getClass (). GetName (), я получаю «Квадрат». Поэтому мне нужно привести myForm к myForm.getClass ().

Вы видите проблему?

1 Ответ

0 голосов
/ 25 ноября 2010

Кастинг не меняет сам объект.Приведение приводит только к изменению того, что компилятор позволяет вам делать с объектом.

Java предоставляет два способа описания того, что вы можете делать с объектом: классы и интерфейсы.То, к чему вы приводите, должно быть тем, о чем знает компилятор во время компиляции.В противном случае компилятор не сможет помешать вам сделать что-то глупое, например, попытаться написать myCircle.bark().

Так что у вас есть два варианта: если у классов есть что-то общее (реализованный интерфейс или классвсе проистекает из) вы можете попробовать привести это общее описание.Но, похоже, это не то, что вы хотите.Вместо этого Java заставляет вас делать это, чтобы иметь цепочку if/else операторов, которые пытаются привести ваш объект к каждому конкретному классу, с которым вы, возможно, захотите что-то сделать, например Square, Circle и т. Д.*

Но приведение объекта к его собственному классу не имеет смысла, потому что оно не дает компилятору никакой информации во время компиляции о том, какие методы объект имеет или не имеет.

...