我正在尝试使用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
传递动态类型B的对象时,其中B延伸A,castedObj
等于obj
。
但我希望castedObj
成为动态类型A的新对象,因为parse
方法依赖于该事实(迭代动态类型类的字段)。
答案 0 :(得分:2)
我正在尝试使用Java.lang.Class.cast将对象强制转换为其超类,但我得到了相同的对象。
这正是应该发生的事情。
对于引用类型,强制转换只是一种类型检查。例如:
A a = (A) b;
这表示要检查b
是否为A
并分配参考,以便我们可以使用A
将其称为a
。
没有对象转换。没有创建新实例。分配给a
的值在各个方面与b
中的值相同。
使用反射进行类型转换时,同样适用。
或者换句话说,getClass()
为给定对象返回的值总是相同的......无论你如何投射都是。
目前尚不清楚您在代码中尝试做什么,但我们假设fillObject
填写了与特定类相关的字段,那么您很可能需要传递{{1} }作为显式参数。真正的Class
类始终是对象的实际类......无论是否有任何演员。