对不起,如果我的格式化不好,第一次使用StackOverflow。 我有一个FruitBuilder类用于一组相同类型的对象,它们都是Fruit类的扩展,FruitBuilder包含一组看起来像这样的变量:
public Apple redApple = new Apple(size, color, price);
public Orange bigOrange = new Orange(size, color, price);
public Pear greenPear = new Pear(size, color, price);
我有一个名为makeFruit的复制方法,它创建一个新的水果并将其添加到ArrayList水果中,如下所示:
public Fruit makeFruit(Fruit f){
Fruit fruit = new Fruit(f.size, f.color, f.price);
fruits.add(fruit);
return fruit;
}
这样可以正常工作,除了它创建一个新的Fruit而不是所需的子类,我可以通过使用一系列instanceof检查然后根据具体情况强制子类来使其工作:
public Fruit makeFruit(Fruit f){
if (f instanceof Apple){
Apple apple = new Apple(f.size, f.color, f.price);
fruits.add(apple);
return apple;
//snip
}
}
有更简单的方法吗?
答案 0 :(得分:3)
使用clone()
- 它专为此目的而设计:
public Fruit makeFruit(Fruit f) {
Fruit fruit = (Fruit)f.clone();
fruits.add(fruit);
return fruit;
}
有几种方法可以使clone()
适用于您的课程。最简单的方法是Fruit
实施Cloneable
:
public class Fruit implements Cloneable {
...
}
这是marker interface,因此您无需实施任何方法。
答案 1 :(得分:2)
您可以在Fruit类
中创建一个抽象方法public abstract Fruit copy()
然后在每个子类中添加一个具体的实现,例如:对于Apple类:
@Override
public Apple copy(){
Apple apple = new Apple(this.size, this.color, this.price);
fruits.add(apple);
return apple;
}
答案 2 :(得分:1)
您可以使用反射:
public Fruit makeFruit(Fruit f)
{
Fruit fruit = f.getClass()
.getConstructor(int.class, int.class, int.class)
.newInstance(f.size, f.color, f.price);
fruits.add(fruit);
return fruit;
}
您需要处理例外情况。