如何将对象强制转换为派生类?为什么下面的内容有(object.getClass())
?
public Object convertObjectToItsOwnClass(Object object) {
object = (object.getClass()) object;
return object;
}
因此,上面的代码应该返回Foo
的实例,而不是在Object
发送给Foo foo
时传回{{1}}的实例。
答案 0 :(得分:1)
object.getClass()
会为您提供Object
类型。但out
的类型为String
,因此您会收到Type mismatch
编译类型错误。
查看评论后If I pass the method Person person then it should use the toString method @Override in Person class.
这可以按照以下方式完成:
public String objectToStringConverter(Object object) {
String out = object.toString();
return out;
}
这将调用Person类的toString
方法。
答案 1 :(得分:1)
在强制转换语句中使用动态类名是不可能!除此之外它没有多大意义。在运行时,Java知道您的对象是什么类型,因此将它强制转换为该类是没有意义的。
如果您希望代码对不同的子类做出不同的反应,那么您可以使用instance of
构造:
if (object instanceof MyClass) {
MyClass myObject = (MyClass) object;
//...
}
如果您只想知道对象来自哪个类,您可以像这样得到它的类名:
String className = object.getClass().getName();
修改强>
没有必要强制转换为子类。如前所述,Java已经知道了子类。参见:
class A {}
class B extends A {}
public class Demo {
public static void main(String[] args) {
Object a = new A();
Object b = new B();
System.out.println(a.getClass().getName()); //prints A
System.out.println(b.getClass().getName()); //prints B
}
}
答案 2 :(得分:0)
toString()
的结果属于String
类型,因此无需在您提供的示例中进行投射。但是,要回答您的问题,如果您想从一种类型转换为另一种类型,并且您知道何时编写代码(即在编译时)您想要转换对象的类型,那么将该类型放入parens中:
Object untypedObject = // ...
String typedObject = (String) untypedObject;
上面的代码执行从Object类型到类型String的转换(作为结果抛出ClassCastException)。当您在编写程序时不知道目标类型是什么时,还有另一种方法(尽管不太常用)(即,直到运行时才知道缩进类型)。例如:
Class<?> runtimeClass = // ...
Object untypedObject = // ...
Object typedObject = runtimeClass.cast(untypedObject);
使用上面的代码,你左边还有一个Object;但是,使用&#34; runtimeClass.cast()&#34;确保对象实际上是给定的运行时类型(如果不是,则抛出异常)。
答案 3 :(得分:0)
String className = object.getClass().getName();
这将为您提供班级的名称。
object.toString();
这将为您提供对象的toString表示。只要它是由方法中传递的对象实现的。请记住,如果toString()方法未通过您传入的对象实现,则会打印对象的哈希码。这是java的默认功能。
根据ThreaT的最新评论,如果你想在运行时将它转换为实际的对象类型,那么你将需要做的事情。我可以在周末晚些时候为您提供代码示例。
但这是方法。
找到类名后,动态创建一个类并加载它。动态创建的类将有一个方法,它将在运行时检查实例并返回Casted对象。但话说回来我不确定实际用途是什么。 如果你可以等到周末,我可以寄给你一个样品。或者自己动手:)。我希望它有所帮助。