我想在窗格中添加两个敌人Dragon
和Orc
。这两个类都扩展了一个名为Entity
的超类,我想为这两个方法创建一个方法。我已尝试使用List<? extends Sprite> list
和List<? super Sprite> list
,但它无法正常工作,因为我需要将对象添加到列表中,稍后在调用add方法时读取它。
public void addDragon(List<Dragon> list) {
double imageWidth = 0;
for(int i = 0; i < 6; i++) {
Dragon dragon = new Dragon();
imageWidth = dragon.getWidth();
pane.getChildren().add(dragon);
list.add(dragon);
}
}
public void addDragon(List<Orc> list) {
double imageWidth = 0;
for(int i = 0; i < 6; i++) {
Orc orc = new Orc();
imageWidth = orc.getWidth();
pane.getChildren().add(orc);
list.add(orc);
}
}
答案 0 :(得分:2)
传入您要创建的Supplier
类型:
public <T extends Sprite> void addThings(List<? super T> list, Supplier<T> supplier) {
然后用该供应商的调用替换构造函数:
T thing = supplier.get();
imageWidth = thing.getWidth();
pane.getChildren().add(thing);
list.add(thing);
您可以调用以下内容:
addThings(listOfDragons, Dragon::new);
addThings(listOfOrcs, Orc::new);
答案 1 :(得分:1)
考虑你的类结构是这样的
public interface Entity {
// abstract methods here
}
public class Orc implements Entity {
//Code here
}
public class Dragon implements Entity {
//Code here
}
现在修改你的方法如下
public <T extends Entity> void addDragon(List<T> list, Class<T> clazz)
throws IllegalAccessException, InstantiationException {
double imageWidth = 0;
for(int i = 0; i < 6; i++) {
T enemy = clazz.newInstance();
imageWidth = enemy.getWidth();
pane.getChildren().add(enemy);
list.add(enemy);
}
}
这里&lt; T extends Entity&gt; 通过传递任何实现Enemies的类来调用您的方法。
答案 2 :(得分:0)
Generic可能会帮助你
public <T extends Entity> void addEntity(List<T> list, Class<T> clazz) {
double imageWidth = 0;
for(int i = 0; i < 6; i++) {
T entity = clazz.newInstance();
imageWidth = entity.getWidth();
pane.getChildren().add(entity);
list.add(entity);
}
}
答案 3 :(得分:0)
为所有实体添加接口或向Entity添加方法。这将包括一个工厂方法来创建特定子类型的新实例,以及getWidth。使用要添加的类型的原型实例调用addEnemy。
public void addEnemy(List<Entity> list,Entity enemy) {
double imageWidth = 0;
for(int i = 0; i < 6; i++) {
Entity someEnemy = enemy.createNewInstance();
imageWidth = someEnemy .getWidth();
pane.getChildren().add(someEnemy );
list.add(someEnemy );
}
}