java ArrayList<anyClassObject> 的动态初始化

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/15697775/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-31 20:32:53  来源:igfitidea点击:

Dynamic initialization of ArrayList<anyClassObject>

javagenericsarraylist

提问by Ahmad Ali Nasir

Normally if we want to initialize a generic non-primitive ArrayList we do this

通常,如果我们想初始化一个通用的非原始 ArrayList 我们这样做

ArrayList<?> arrayList = new ArrayList<MyClass.class>();

But I want to do something similar to this no matter which class object I pass, i.e

但无论我通过哪个类对象,我都想做类似的事情,即

private void getModel(Class responseType){

   //Something similar, because this does not work..                                                       
   ArrayList<?> arrayList = new ArrayList<responseType>();
}

Any Help would be greatly appreciated.

任何帮助将不胜感激。

回答by Festus Tamakloe

Try something like this

尝试这样的事情

     private <T> void setModel(Class<T> type) {
      ArrayList<T> arrayList = new ArrayList<T>();
   }

If you want to get the list back then

如果你想取回列表,那么

private <T> ArrayList<T> getModel(Class<T> type) {
      ArrayList<T> arrayList = new ArrayList<T>();
      return arrayList;
   }

EDIT

编辑

A FULL EXAMPLE SHOWING HOW TO USE GENERIC TYPE FOR ARRAYLIST

一个完整的例子,展示了如何将通用类型用于数组列表

Tester class with main method and the generic Method

带有 main 方法和泛型方法的测试器类

public class Tester {

    private <T> ArrayList<T> getModels(Class<T> type) {
        ArrayList<T> arrayList = new ArrayList<T>();
        return arrayList;
    }


    public static void main(String[] args) {
        Data data = new Data(12, "test_12");
        Magic magic = new Magic(123, "test_123");

        Tester t = new Tester();

        ArrayList<Data> datas = (ArrayList<Data>) t.getModels(Data.class);
        datas.add(data);
        for(Data data2 : datas) {
            System.out.println(data2);
        }

        ArrayList<Magic> magics = (ArrayList<Magic>) t.getModels(Magic.class);
        magics.add(magic);
        for(Magic magic2 : magics) {
            System.out.println(magic2);
        }

    }

}

Another possibility to use the same things without parameter since we don't use it inside the method

另一种不带参数使用相同内容的可能性,因为我们不在方法内部使用它

public class Tester {

    private <T> ArrayList<T> getModel() {
        ArrayList<T> arrayList = new ArrayList<T>();
        return arrayList;
    }


    public static void main(String[] args) {
        Data data = new Data(12, "test_12");
        Magic magic = new Magic(123, "test_123");

        Tester t = new Tester();

        ArrayList<Data> datas =  t.getModel();
        datas.add(data);
        for(Data data2 : datas) {
            System.out.println(data2);
        }

        ArrayList<Magic> magics = t.getModel();
        magics.add(magic);
        for(Magic magic2 : magics) {
            System.out.println(magic2);
        }

    }

}

Model class (Data)

模型类(数据)

public class Data {

    private Integer id;
    private String name;


    public Data() {
    }


    public Data(Integer id, String name) {
        super();
        this.id = id;
        this.name = name;
    }


    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }


    @Override
    public String toString() {
        return "Data [" + (id != null ? "id=" + id + ", " : "") + (name != null ? "name=" + name : "") + "]";
    }

}

Model class (Magic)

模型类(魔术)

public class Magic {

    private Integer id;
    private String name;


    public Magic() {
    }


    public Magic(Integer id, String name) {
        super();
        this.id = id;
        this.name = name;
    }


    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }


    @Override
    public String toString() {
        return "Data [" + (id != null ? "id=" + id + ", " : "") + (name != null ? "name=" + name : "") + "]";
    }

}

回答by newacct

This works:

这有效:

private void getModel(){
   ArrayList<?> arrayList = new ArrayList<Object>();
}

I mean, it is unclear what you are trying to do. Generics is purely compile-timem, to perform compile-time type checking. Therefore, if the type parameter is not known at compile time, it would be useless.

我的意思是,目前还不清楚你想要做什么。泛型纯粹是编译时,用于执行编译时类型检查。因此,如果在编译时不知道类型参数,它将毫无用处。

回答by Dev Blanked

Try using following

尝试使用以下

public <T> List<T> getList(Class<T> requiredType) {
    return new ArrayList<T>();
}

public void useList() {
    List<Integer> ints = getList(Integer.class);
    List<String> lists = getList(String.class);
}