Java Cast对象从提供的实例派生类

时间:2014-05-02 09:35:27

标签: java

如何将对象强制转换为派生类?为什么下面的内容有(object.getClass())

public Object convertObjectToItsOwnClass(Object object) {
     object = (object.getClass()) object;
     return object;
}

因此,上面的代码应该返回Foo的实例,而不是在Object发送给Foo foo时传回{{1}}的实例。

4 个答案:

答案 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对象。但话说回来我不确定实际用途是什么。 如果你可以等到周末,我可以寄给你一个样品。或者自己动手:)。我希望它有所帮助。