2015-02-28 2 views
0

Я пытаюсь передать объект в его суперкласс с помощью Java.lang.Class.cast, но я получаю тот же объект. В чем причина?Java.lang.Class.cast не возвращает литой объект

Это код, я бегу:

public static void parse(Object obj) 
{ 
    // parse all super classes 
    Class<?> clazz = obj.getClass().getSuperclass(); 
    if (!clazz.equals(prevClass)) 
    { 
     prevClass = clazz; 
     Object castedObj = clazz.cast(obj); 
     parse(castedObj); 
    } 
    fillObject(obj); 
} 

, но при переходе к parse объект динамического типа В, где В простирается А, castedObj равно obj. Но я хочу, чтобы castedObj был новым объектом динамического типа A, потому что метод parse полагается на этот факт (итерации в полях класса динамического типа).

+3

Как вы думаете, что делает литье? –

+0

Кастинг! = Создание объекта. –

+0

Вы неправильно понимаете значение 'cast'. Вы не получите новый объект, просто тот же объект, который был добавлен в другой тип. Вы не меняете динамический тип. Для этого вам нужно создать специальный метод. –

ответ

2

Я пытаюсь применить объект к его суперклассу с помощью Java.lang.Class.cast, но я получаю тот же объект.

Именно это и должно произойти.

Для ссылочных типов бросок - это просто проверка типа. Например:

A a = (A) b; 

Это говорит о том, чтобы проверить, что b есть-A и присвоить ссылку так, что мы можем обратиться к нему как A использованием a.

Объект конверсии не происходит. Нет создания новых экземпляров. Значение, присвоенное a, во всех отношениях идентично значению в b.

То же самое применимо и при использовании отражения, чтобы сделать приведение типов.

Или, говоря иначе, значение, возвращаемое getClass() для данного объекта, всегда будет таким же ... независимо от того, как вы делаете это.


Не ясно, что вы пытаетесь сделать в вашем коде, но мы предполагаем, что fillObject является заполнение полей, которые относятся к определенному классу, то вам, скорее всего, нужно передать Class как явные параметр. Истинный класс obj всегда будет действительным классом объекта ... независимо от кастинга.

+0

'fillObject()' делает именно это, и передать ему 'Class', вероятно, будет решение.Я думал, что 'Cast' вернет другой указатель, аналогично C++, но я ошибся ... –

+0

@Torque_Roll в C++,' class A {}; класс B: public A {}; B * b = новый B; A * a = (A *) b; cout << (a == b? "true": "false"); 'печатает что? – immibis

+0

@Torque_Roll - Ваше утверждение о том, что C++-литье дает вам другой указатель ... озадачивает. Возможно, вы можете сделать это с перегрузкой оператора, но AFAIK это не происходит с обычными (не перегруженными) отбрасываниями на типы объектов/указателей. –

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