Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将基类的对象强制转换为派生类_Java_Inheritance_Casting_Object Oriented Analysis_Downcast - Fatal编程技术网

Java 将基类的对象强制转换为派生类

Java 将基类的对象强制转换为派生类,java,inheritance,casting,object-oriented-analysis,downcast,Java,Inheritance,Casting,Object Oriented Analysis,Downcast,我发现自己处境艰难我在jar中提供给我的现有项目的基础上构建一些逻辑。因此,我无法修改这些类。 我想为现有类编写额外的方法,使其功能更加丰富。这些方法将对少量实例数据进行操作,并使用一些现有的实例方法 强>由于类不能直接修改,我在新的派生类中写入这些附加方法。< /强>考虑下面的例子 public class Parent { public void existing method() { } } public class Child extends Parent { p

我发现自己处境艰难我在jar中提供给我的现有项目的基础上构建一些逻辑。因此,我无法修改这些类。

我想为现有类编写额外的方法,使其功能更加丰富。这些方法将对少量实例数据进行操作,并使用一些现有的实例方法

<>强>由于类不能直接修改,我在新的派生类中写入这些附加方法。< /强>考虑下面的例子

public class Parent
{
  public void existing method()
  {

  }
} 


public class Child extends Parent
{
  public void newMethod()
  {

  }
}


public class Other
{
  public Parent foo()
  {
     Parent pr = new Parent();
     return pr;
  }
}

public class Test
{
   Other o = new Other();
   Parent p = o.foo;
   Child c = (Child) p;
   c.newMethod();
}
当我运行这段代码时,我得到一个
ClassCastException
。我知道我情绪低落有没有办法将基类的对象强制转换为派生类的对象?

如果是的话,什么是一个可以让人沮丧的合理场景?

如果不是,那么应该如何处理上述情况。我是否应该更改设计


感谢您的评论/建议

您试图做的事情违背了多面体和传统的概念,您只能将子对象放入父对象中,因为它们共享相同的基本属性,但您不能尝试将父对象强制放入其子对象中

我建议在您的另一个类中创建一个“cast”方法,在该方法中,您将获取子类中所有重要的内容,然后使用该数据创建一个父对象并返回它

大概是这样的:

public Parent downcast(Child c)
{
    Parent cast = new Parent();
    //Transfer data from the child to the parent
    cast.setProperty(c.getProperty());
    return cast;
}
可能有比这更好的解决方案,但它可以轻松解决您的问题

更新
这对你也有帮助,也许是复制品

调用newMethod()时,为什么不能在派生类上调用它?像new Child().newMethod()?是什么阻止您在测试中直接创建子类?Child c=new Child()?应该在方法foo()中创建Child的实例。还是因为某些原因不可能?@KumarAbhinav请参考上面的例子。我必须调用“Other”类的foo方法,它返回一个“parent”类的对象。newMethod具有我想要对属于父类的p的数据成员执行的操作,我希望这能澄清为什么我不能直接创建子类的实例。