我有多个类都继承自同一个Block
类,并希望根据变量值实例化其中一个类。
以下是我现在所做的事情:
public enum MapCases {
FLOOR (Floor.class), // These are all subclass of my Block class
WALL (Wall.class),
ROCK (Rock.class);
private Class<?> blockType;
MapCases (Class<?> pointing) {
this.block = pointing;
}
public Class<?> getType () {
return this.blockType;
}
};
然后,我尝试在给定一些数据的情况下实例化它们:
private Block[] blocks; // Array of the mother type
...
blocks = new Block[data.length]; // data is an int array
for (int i = 0; i < data.length; i++) {
int choice = data[i];
Class<?> blockType = MapCases.values()[choice].getType();
blocks[i] = new blockType(); // blockType is of unresolved type
}
但是Eclipse向我显示了一个错误,说它无法将blockType解析为某种类型(鉴于java还不知道该类型,这似乎是合乎逻辑的。)
我怎样才能实现我的目标?
答案 0 :(得分:3)
你不应该需要反思来做到这一点。请考虑一下:
public enum MapCases {
FLOOR {
@Override
public Block makeBlock() {
return new Floor();
}
},
WALL {
@Override
public Block makeBlock() {
return new Wall();
}
},
ROCK {
@Override
public Block makeBlock() {
return new Rock();
}
};
public abstract Block makeBlock();
}
在这种情况下,枚举本身就是工厂,而不是它所持有的Class
令牌。
请注意,如果您确实想要坚持Class
令牌,则应在评论中将其标记为Class<? extends Block>
,Elliott Frisch points out。然后拨打blockType.getConstructor().newInstance()
,GGrec's answer demonstrates,将返回Block
的实例。
答案 1 :(得分:2)
使用反射从类蓝图中创建一个新实例。
模式:
Class.forName(className).getConstructor().newInstance();
你的案子:
blocks[i] = blockType.getConstructor().newInstance();