带类型的Java通用列表类

时间:2015-10-21 22:12:49

标签: java generics

我有一个解析字符串的方法调用,而parse方法的第二个参数是它将返回的类型。要解析一个人,我们使用:

Person p = myParser.parse("name=Mike", Person.class);

这很好用,这也适用于列表:

List<Person> lop = myParser.parse(somestring, List.class);

然而,这给了我一个编译器警告,因为我真正想要的是List<Person>.class,但我无法弄清楚语法。

我该怎么做?

2 个答案:

答案 0 :(得分:2)

由于 type erasure ,您无法使用List<Person>.class。在运行时,没有List<Person>.class个对象。只有一个List.class。 (或者每个类加载器最多一个。)

您可以做的是提供一个兄弟方法,允许调用者指定容器类型及其类型参数。例如:

List<Person> lop = myParser.parseList( somestring, Person.class );

或者,如果你想做一张地图:

Map<Person,Integer> map = myParser.parseMap( somestring, Person.class, Integer.class );

答案 1 :(得分:1)

你可以通过多种方式解决这个问题,但最好的方法是添加方法

List<Person> lop = myParser.parseList(somestring, Person.class);

您的方法将能够“知道”列表元素的类型。

你可以做到这一点的另一种方法是忽略警告,但这可能只是隐藏了问题。