Java在运行时创建列表

时间:2015-03-16 19:47:01

标签: java

这是一个示例程序。注释右边会失败,我想知道我是否可以创建一个方法来实现在运行时创建列表的功能。

import java.util.ArrayList;
import java.util.List;

public class ListMaker 
{

    public static List<?> makeList(Class clazz)
    {
        // I want to do something like this
        return new ArrayList<clazz>();
    }

    public static void main(String[] args)
    {
        Vo object = new Vo(100);
        ArrayList<Vo> list = makeList(Vo.class);
        list.add(object);
    }
}
class Vo 
{
    int i;
    public Vo(int i){this.i = i;}
}

2 个答案:

答案 0 :(得分:3)

这不是你如何使用泛型,你实际上不能用Java做什么(创建一个makeList方法,它使用一个类参数返回一个特定的ArrayList,然后应该用作T)。

请记住,泛型只是一个编译器功能,对于类型擦除的效果,当编译为字节码时,ArrayList<T>将变为简单ArrayList(您将只能检索有关原始的详细信息)使用反射类的类型参数,该反射类在运行时从字符串化方法签名中提取该信息。

T ArrayList<T>中的{{1}}不是变量,您无法在运行时创建参数化类型,就像您尝试的那样。您可以使用包含各种Object的普通旧ArrayList,而无需进行类型检查。

答案 1 :(得分:1)

main方法中,List的类型已知(它是List<Vo>)。在这种情况下,您不需要像通用方法那样传递Class对象:

public static <T> List<T> makeList()
{
    return new ArrayList<T>();
}

这可以通过编写List<Vo> list = makeList();

来调用

但是我不明白为什么你需要一个方法(List<Vo> list = new ArrayList<Vo>();出了什么问题?

如果类型T未知且您拥有的只是ClassClass<?>对象,那么您尝试做的事情在Java中没有意义。在运行时,没有List<String>List<Vo>这样的东西,因为所有类型信息都被删除。

在运行时只有原始List