Java 克隆存储在HashMap中的对象并将其添加到ArrayList

Java 克隆存储在HashMap中的对象并将其添加到ArrayList,java,arraylist,hashmap,Java,Arraylist,Hashmap,假设我有一个名为实体,另一个名为板条箱,它扩展了这个实体。然后我将这个板条箱添加到实体的HashMapentityTypes,其中键是“板条箱”。如何将此板条箱的新实例添加到ArrayList class Entity { // stuff } class Crate { // stuff public Crate() { System.out.println("hi there"); } } class Main { public v

假设我有一个名为
实体
,另一个名为
板条箱
,它扩展了这个实体。然后我将这个板条箱添加到实体的HashMap
entityTypes
,其中键是“板条箱”。如何将此板条箱的新实例添加到ArrayList

class Entity {
    // stuff
}

class Crate {
    // stuff
    public Crate() {
        System.out.println("hi there");
    }
}

class Main {
    public void foo() {
         HashMap<String, Entity> entityTypes = new HashMap<String, Entity>();
         entityTypes.put("Crate", new Crate());

         ArrayList<Entity> entities = new ArrayList<Entity>();
         entities.add(entityTypes.get("Crate")); // create a new instance here?
    }
}
类实体{
//东西
}
分类板条箱{
//东西
公共板条箱(){
System.out.println(“你好”);
}
}
班长{
公共图书馆{
HashMap entityTypes=新HashMap();
entityTypes.put(“板条箱”,新板条箱());
ArrayList实体=新的ArrayList();
entities.add(entityTypes.get(“板条箱”);//在这里创建一个新实例吗?
}
}

如果我要运行该代码,那么当我将板条箱构造函数添加到HashMap时,它只会被调用一次。当我将它添加到arraylist中时,有没有办法创建一个新的实例?

您可以在
实体
类中放置一个方法来生成一个新实例

class Entity {
    public Entity newInstance() {
        return new Entity();
    }
}
并让子类相应地覆盖它:

class Crate extends Entity {
    @Override
    public Entity newInstance() { 
        return new Crate();
    }
}
然后,当您从
HashMap
中提取内容时,可以调用该方法:

List<Entity> entities = new ArrayList<Entity>();
entities.add(entityTypes.get("Crate").newInstance());
然后调用它变成:

List<Entity> entities = new ArrayList<Entity>();
entities.add(entityTypes.get("Crate").copy());
List entities=new ArrayList();
entities.add(entityTypes.get(“板条箱”).copy());

我认为您应该首先阅读java基础知识。您需要显式地显示您的对象。您没有在此代码中扩展
cratet
类:)此外,您到底想向
ArrayList
添加什么,即
entityTypes
中的相同
cratet
对象或新的
cratet
对象,“我没听懂你的话?”索拉呜呜声,这只是一个更大版本的粗略代码application@dejvuth嗯,我想我必须复制/克隆它。我试着用“Bhasker Tiwari”来回答,但似乎不起作用。
List<Entity> entities = new ArrayList<Entity>();
entities.add(entityTypes.get("Crate").copy());