假设我有一个类 Foo,以及两个扩展 Foo 的类 Foo1 和 Foo2。
假设我有一个 Foo f,结果是一个 Foo1 ,并且我想在不使用构造函数的情况下更改它。如果只是更改 f 的字段,我可以手动完成:
f.field1= ..
f.field2= ..
但是如果我想把它变成 Foo2 该怎么办呢?
注意:重点是我想做这样的事情:
Foo f=new Foo1( ...);
Foo g=f;
g=new Foo2(...);
并且当 g 改变时 f 也改变,但显然这是行不通的。
最佳答案
你也许可以围绕这些思路做一些事情。注意:此代码是伪代码。
abstract class Common{
...
}
class Foo{
private Common currentReference;
public Foo(...){
currentReference = new Foo1();
}
public Foo changeReferenceToClass(Class clazz){
...
currentReference = clazz.newInstance();
...
return this;
}
public <T extends Common> T getReference()
{
return (T) currentReference;
}
}
class Foo1 extends Common{
...
}
class Foo2 extends Common{
...
}
Foo f=new Foo( ... );
Foo g=f;
g=g.changeReferenceToClass(Foo2.class);
它的作用是:
- 创建一个类,其中包含对具有
common
接口(interface)的对象的引用(在示例中为Common
抽象类。 - 在构造时实例化对默认值的引用(示例中为
Foo1
)。 - 提供
更改
和获取
引用的方法。 - 当您在一个位置将引用更改为 Foo2 时,您可以在所有位置访问它
在示例中,当您更改 g
以保存对 Foo2
的引用时,f
将保存对 Foo2< 的引用
也是如此。
关于java - 如何在不创建新对象的情况下更改对象的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23273235/