在运行时更改对象类型

时间:2011-05-21 03:10:58

标签: java

我有以下情况:

class Parent {}

class Child1 extends Parent {}

class Child2 extends Parent {}

interface ExternalSystem {
    Parent materialize(Parent a)
}

class Child1System implements ExternalSystem {
    Parent materialize(Parent a) {
        // specialize a and convert it into Child1
    }
}

class Child2System implements ExternalSystem {
    Parent materialize(Parent a) {
       //  specialize a and convert it into Child2
    }
}

我想让用户创建Parent类型的对象。使用Parent提供的信息,系统的某些组件可以正常运行。但是,在某些时候,我想在外部系统中实现这些对象,并且根据我调用的ExternalSystem实现,Parent对象现在应该是专用对象。

有没有办法创建新的子对象并替换父对象使用的空间?

我不能仅使用Parent aChild1类型的新对象替换Child1对象,因为a可能已在其他位置引用。所以,基本上,我想要的是所有引用继续查看Parent a,而不是a类型Parent,它现在将是一个子类型。

或者,这可以设计不同吗?

2 个答案:

答案 0 :(得分:4)

Java中没有placement new功能。根据托管堆的定义。

您唯一能做的就是创建实现ExternalSystem的代理对象。该代理将调用child1或child2的实例。

答案 1 :(得分:3)

  

有没有办法创建新的子对象并替换父对象使用的空间?

没有办法。对象的类型在对象的生命周期内不会更改。给定引用始终指向同一对象。

你可以做的是使用某种代理或委托机制,并让代理/委托在其生命周期中引用不同的东西。代理/委托对象的类型不会改变,但在大多数方面它的行为类似于其中一个子类型的实例。 (有一件事无效......当然......将是instanceof运营商。)