我在使用hashmap中的存储类创建新实例时遇到了问题。
我在做: 将类的实例保存到散列映射为referal以通过UIN加载类(唯一的项目名称)((这是一个字符串))
问题: 保存的实例保持不变,导致为保存的每个块放置相同的实例,这导致在加载保存时仅替换一个块。寻找:我将如何创建一个新实例,以便我可以正确地放置所有块?
代码:
注册:
/*======================Registry===========================*/
public static HashMap<String, Block> registeredBlocks = new HashMap<String, Block>();
public static void registerBlock(Block block){
registeredBlocks.put(block.getUIN(), block);
}
public static void loadBlocks(){
registerBlock(new BlockChest());
registerBlock(new BlockTree());
System.out.println(registeredBlocks);
System.out.println(registeredBlocks.containsKey("chestBlock"));
System.out.println(registeredBlocks.get("chestBlock"));
System.out.println(Blocks.chest);
}
public static Block getBlockFromUIN(String uin){
if(registeredBlocks.containsKey(uin)){
return registeredBlocks.get(uin);
}
return null;
}
参考
public static BlockChest chest = (BlockChest)Block.registeredBlocks.get("chestBlock");
public static BlockTree log = (BlockTree)Block.registeredBlocks.get("treeLog");
答案 0 :(得分:2)
您没有在您的hashmap中存储类:
HashMap<String, Block> registeredBlocks
这是将字符串映射到Block
个实例,因此您正在观察的行为。
相反:
HashMap<String, Class> registeredBlocks
将存储Class对象
registeredBlocks.put(block.getUIN(), block.getClass()); //or Block.class
将Block
类放在你的地图上,不管键是什么键,还是
Block b = (Block)registeredBlocks.get(keyString).newInstance();
将为您提供该类的新实例,强制转换为Block
。
注1:这是使用Class.newInstance()
方法。
注2:这纯粹是对你问题的回答。你想要做的事情在你的帖子中并不是很明显,但我相信你有更清洁/更好的方法来实现你想要实现的目标。