2012-03-19 3 views
2

Если у вас есть два различных класса А и В, и В является подклассом А, вы не можете отбрасывать следующим образом:пользовательского объекта литья Метод

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; 
+0

'class B расширяет A {}', правильно? Должен работать даже без приведения. –

+0

В любой ситуации, в которой вызывается объект типа 'A', объект типа' B' является жизнеспособным заменителем, без необходимости кастинга. –

+0

@OliCharlesworth Это может сделать смысл в контексте, что dscer работает ... это просто простой пример –

ответ

2

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

A newA = b; 
4

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

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

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

2

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

A a = new A(); 
B b = new B(); 
A newA = b; // no need to cast! 
1

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

B newB = new B(a); 

или

B newB = B.of(a); 

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

Смежные вопросы