这是一个示例程序。注释右边会失败,我想知道我是否可以创建一个方法来实现在运行时创建列表的功能。
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;}
}
答案 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
未知且您拥有的只是Class
或Class<?>
对象,那么您尝试做的事情在Java中没有意义。在运行时,没有List<String>
或List<Vo>
这样的东西,因为所有类型信息都被删除。
List
。