2015-10-21 3 views
3

У меня есть вызов метода, который анализирует строку, а второй аргумент метода parse - это тип, который он вернет. Чтобы разобрать Person, мы используем:Java Generic List Class с типом

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

Это прекрасно работает, и это тоже работает для списков:

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

Однако, это дает мне предупреждение компилятора, так что я действительно хочу List<Person>.class, но я не могу понять синтаксис.

Как это сделать?

ответ

1

Вы можете взломать этот ряд способов, но лучше всего, вероятно, будет добавить метод

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

Ваш метод будет иметь возможность «знать» тип элементов списка.

Другой способ, которым вы можете это сделать, - игнорировать предупреждение, однако это может быть просто скрытие проблемы.

+0

Спасибо, я хочу, чтобы попытаться сделать это в одном методе и не хочу, чтобы игнорировать предупреждение. Должен быть способ указать тип общего класса, я бы подумал. – mikeb

2

Вы не можете использовать List<Person>.class по причине type erasure. Во время выполнения нет объекта List<Person>.class. Существует только один List.class. (Или не более одного для каждого загрузчика классов.)

Вместо этого вы можете предоставить метод sibling, который позволяет вызывающему указать как тип контейнера, так и его параметры типа. Например:

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

Или, если вы хотите, чтобы сделать карту:

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