在Java中向下转换对象

时间:2013-11-27 10:47:06

标签: java downcast

class A{

}

public class Demo 
{
  public static void   main(String s[])
  {         
      Object o=(Object) new Demo();
      if (((A)(o)) instanceof Object) 
      {
           System.out.println("true");
      }
  }
}

我在运行Demo.java类时遇到异常:

java.lang.ClassCastException: Demo cannot be cast to A

如何低估oclass A的引用?

7 个答案:

答案 0 :(得分:4)

只有当Demo扩展A时才能这样做,否则,您根本无法将类对象强制转换为任何其他类型。

public class Demo extends A {

答案 1 :(得分:1)

让我们从头开始:这是可怕的代码。 话虽如此:

  • 您正在将Demo转换为Object(无论出于何种原因,因为在Java中,一切都是Object,无需强制转换)。
  • 然后你将o,你知道它是Demo的类型投射到A(为什么这会起作用?)。
  • 您正在检查Object o是否为Object类型(为什么会失败?)

一些注意事项:

  • o不应该被视为引用,它是Object的一个实例,就像你声明它一样。忘记C中的工作原理。
  • 考虑接口以及是否希望A成为Demo实现的接口。
  • 您只能将实例强制转换为已扩展的类。

Downcast示例:

    public class A {
    int variable = 0; 
}

public class Demo extends A{

}

public void testDowncast(){
    Demo myClass = new Demo();
    myClass.variable = 2;
    A morphingTime = myClass;
    System.out.println("And now Power Ranger Demo has turned into Mighty A:");
    System.out.println("I am: "+morphingTime.getClass() + " and my variable is: " + morphingTime.variable);
}

答案 2 :(得分:1)

R J的回答是正确的

  

只有在Demo扩展A

时才能这样做

为了您的信息,您在分配到Object

时无需键入任何对象
Object o= new Demo();

并且每个对象始终为instanceof对象,即类对象的条件instanceof Object始终为true

你为什么要这样做,((A)(o))而没有用instanceof检查类型,而应该是,

if (o instanceof A) 

答案 3 :(得分:1)

首先,你得到'ClassCastException',因为你的实际对象'o'是类型'Demo'而类'Demo'和'A'不在同一个继承树中。您没有得到编译错误,因为您已将对象转换为类'Object'(因为'A'和'Object'在同一继承树中)。要解决您的情况,您应该更改代码,使它们('Demo和'A')成为同一继承树的一部分。例如,你可以从A扩展Demo。然后,检查对象'o'而不像这样

    if (o instanceof A) {
      // now cast to 'A' 
      // and invoke any accessible method (or etc.) that class A provides
      ((A)o).doSomthingMathod(); 
    }

答案 4 :(得分:0)

首先,您不需要将Demo实例转换为对象而不进行转换,您可以将Demo引用分配给Object类,因为Object是所有java类的超类。

public class Demo extends com.A {

}

答案 5 :(得分:0)

您只需将代码重写为

即可
Object o=new Demo();
  if (o instanceof A) 
  {
       System.out.println("true");
  }

然后看看Demo extends A

会发生什么变化

答案 6 :(得分:0)

向下转换是将基类的引用转换为其派生类之一的行为。

例如:

public class Parent{}
public class Child extends Parent{}

public static void main(String args[]){
Parent parent = new Child();              // Parent is parent class of Child, parent variable holding value of type Child
Child child = (Child)parent;              // This is possible since parent object is currently holding value of Child class
}

您可以参考this问题来获得答案。