这不是一个常规问题,请听我的解释。
我有一个班级Cat
的对象。如何将其转换为子类Animal a = new Animal();
Cat c = (Cat) a;
?像这样:
Animal
当然,我知道不可能直接从Cat
投射到Cat
。但我不想手动创建新的Animal
并将字段从DI
复制到其中。因为有时候我有很多需要转换的类层次结构。我怎样才能以一般方式解决它?
答案 0 :(得分:3)
忽略这样一个事实,在你的例子中你要反转原样关系(如“苹果是一个水果”与“一个水果是一个苹果”) - 这在某种程度上是没有意义的。
但是让我们想象一下,你必须让一个potate 看起来像一个苹果。所以你要做的就是把所有的果肉都拼成苹果(我在这里使用水果的例子,因为动物会变得有点乱)。 这可以称为代理或包装。
这两种技术都可以在java中静态或动态完成。
静态:包装器:
动态:代理:
interface Apple
)Apple
接口MethodInvocationHandler
,类似于Wrapper,但使用Reflection Apple
使用Java动态代理的替代方法是代码生成库,例如CGLib或Javaassist,它们在运行时生成目标类型的子类,它与包装器基本相同,但是像代理一样实现
为了将值从动物复制到cat实例(因为动物是超类,一些字段应该是常见的),你也可以使用反射api
for(Field f : Animal.class.getDeclaredFields()) {
f.setAccessible(true)
f.set(cat, f.get(animal));
}
这只是一个简单的例子,没有异常处理,也没有考虑Animal的超类字段(getDeclaredFields
只检索 this 类的字段)。
答案 1 :(得分:2)
如何在子类中创建复制构造函数?
Animal
在super(animal)
类中声明这样的构造函数,只需使用googleMapEngine.load(getClass().getResource("/googleLondonMap.html").toExternalForm());
从任何子类传递一个控件,您将在其中定义自定义逻辑。
答案 2 :(得分:-1)
我认为你做对了
Animal animal = new Animal();
Cat cat = new Cat();
public void foo(){
animal = cat; //works because Animal is parent class
cat = (Cat) animal; //you cast Animal to Cat like as parent to child
}
查看https://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html
我希望它会有所帮助