2014-02-10 3 views
0

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

class Rabbit implements Cloneable { 
private int r; 
public Rabbit(int y) { 
    r= y; 
} 
public Object clone() { 
    Object result = new Rabbit(this.r); 
    return result; 
} 

class Bunny extends Rabbit { 
private int b; 
public Truck(int z) { 
    super(z); 
    b = z; 
} 
public Object clone() { 
    Object result = super.clone(); 
    (Bunny) result).b = this.b; 
    return result; 
} 

Почему я продолжаю получать классное исключение во время реализации?

+0

Вы не показываете метод 'main', поэтому невозможно сказать, как вещи вызываются. –

+0

Нельзя использовать имя метода 'clone' для ваших методов, так как это предопределенный метод Object. –

+0

Догадывается, что ваш 'main' создал Bunny, а затем назвал его« clone ». Это было бы каскадом к «клону» Кролика, который создал бы нового Кролика и вернул его. Затем вы пытаетесь обращаться с возвращенным кроликом как с зайчиком, поэтому исключение. –

ответ

0

Поймите, что в Java «слепок» обозначение (someType) используются для трех различных (и в основном не связанных между собой) вещей:

  1. принуждения между примитивными типами, как при преобразовании int в char. В этом случае фактическое значение может быть изменено (например, путем обрезки посторонних битов).
  2. (В редких случаях) Чтобы принудительно преобразовать «бокс»/«unboxing», например, int в Integer.
  3. Утверждение типа для ссылки на объект, которая противоречит объявленному типу.

Это третье использование, с которым вы связаны. Важно понимать, что, в отличие от двух других, это никоим образом не изменяет значение времени выполнения ссылки на объект или самого объекта. Скорее, он сообщает компилятору (и JVM «verifier») «Эй, компилятор, я знаю, что эта ссылка объявлена ​​как ссылка ObjectA, но она действительно ссылается на ObjectB - поверьте мне!» Поэтому компилятор принимает это утверждение, но JVM, будучи ненадежной душой, настаивает на проверке во время выполнения. Если ссылочный объект не является объектом ObjectB (или некоторым подклассом ObjectB), тогда генерируется исключение ClassCastException.

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