Метод кастомного объекта - PullRequest
2 голосов
/ 19 марта 2012

Если у вас есть два разных класса A и B, а B является подклассом A, вы не можете разыграть следующее:

A a = new A();
B b = new B();
A newA = (A)b;

Есть ли способ включить вышеуказанный код для работы (без изменений в вышеуказанном коде) без JVM, генерирующей исключение ClassCastException?

------------ EDIT ----------

Извините, я допустил ошибку в коде в приведенном выше вопросе. Правильная версия ниже:

A a = new A();
B b = new B();
B newB = (B)a;

Ответы [ 4 ]

4 голосов
/ 19 марта 2012

B уже имеет отношение is-a к A.Вам не нужно разыгрывать его .... Вы можете бросить B любым методом или ссылкой, которые ожидают / указывают на A.

На основании вашего редактирования - что-то не так с вашимдизайн, если вы хотите сделать это.В то время как B является A, обратное НЕ верно.A не является B.Другими словами, поскольку B расширяет A, возможно, в нем есть методы / свойства, которые НЕ определены в A.Если вы приведете A к B, то методы, которые принимают эту ссылку, могут попытаться вызвать метод, который, по его мнению, находится в экземпляре, поскольку вы сказали компилятору, что он получил B, хотя в действительности базовыйA не имеет требуемого метода.

Приведение здесь приводит только к боли и неудаче.

2 голосов
/ 19 марта 2012

Если B является подклассом A, вышеприведенное должно работать, и приведение будет ненужным:

A a = new A();
B b = new B();
A newA = b; // no need to cast!
2 голосов
/ 19 марта 2012

Я думаю, вы можете просто назначить:

A newA = b;
1 голос
/ 19 марта 2012

С новым кодом, нет, вы не можете этого сделать.Вам нужно будет создать новый объект:

B newB = new B(a);

или

B newB = B.of(a);

В любом случае следует вообще избегать неабстрактного неконечного класса.Кроме того, начиная с версии 1.5 (выпущенной в 2004 году), синтаксиса приведения типов не должно быть много.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...