Java如何在运行时创建列表

3

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

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;}
}

这是为了避免每次需要一个Vo列表时都要写出new ArrayList<Vo>()吗?否则我不明白你可能从中获得什么好处。 - Mark W
2个回答

3

这不是使用泛型的正确方式,而且在Java中你不能实际做到你正在尝试做的事情(创建一个makeList方法,该方法返回一个特定的ArrayList,使用一个类参数作为T)。

记住,泛型只是编译器的一种特性,而对于类型擦除的影响,当编译成字节码时,那些ArrayList<T>将变成简单的ArrayList(可以使用反射类从字符串化的方法签名中提取信息来检索有关原始类型参数的详细信息)。

ArrayList<T>中的T不是变量,您无法在运行时创建一个参数化类型,就像您正在尝试做的那样。您可以使用普通的ArrayList,其中包含每种类型的Object而没有类型检查。


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


谢谢你的回答。我还在努力理解泛型。这更多是一个假设性问题,以试图更好地理解泛型。 - sdc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接