Список Java параметризован? - PullRequest
4 голосов
/ 31 августа 2009

Я новичок в Java ... Я написал класс под названием DLPFile который в основном является контейнером других объектов, таких как Strings, Ints, float и т. д.

Когда я помещаю мои файлы в список, а затем сохраняю его в моем сеансе (который из класса Map), переменная легко;

DLPFile file = new DLPFile();
List <DLPFile >fileList =  new ArrayList <DLPFile>();
fileList.add(file);
session.put("filesList", fileList);

но как мне получить список из сеанса var? Когда я делаю:

List <DLPFile files = (List) session.get("fileslist");

Я получил несколько предупреждений:

"List is a raw type.References to generic type List<E> should be parameterized."

Я пытался

List <DLPFile files = (List <DLPFile> ) session.get("fileslist");   
List <DLPFile files = (List ) session.get("fileslist")<DLPFile>; and
List <DLPFile files = (List) <DLPFile>  session.get("fileslist");

но ни один не работает

Полагаю, это какая-то проблема с "кастингом" ... (может быть?)

Заранее спасибо;)

Ответы [ 5 ]

3 голосов
/ 31 августа 2009

Это из-за стирания Generics Type. Компилятор не может определить фактический аргумент универсального типа, когда вы получаете его из своего сеанса (кроме случаев, когда ваш session.get принимает аргумент Class для его приведения соответственно), потому что сеанс, вероятно, возвращает только тип объекта. Вы можете убедиться, что ваш объект является экземпляром List, но информация об общем типе теряется (в основном компилятор преобразует его в List для внутреннего использования). Вот почему вы получаете предупреждение, потому что только вы, как программист, можете знать, является ли параметр универсального типа, к которому вы хотите привести его, правильным.

Если вам не нравится предупреждение, вы можете добавить

@SuppressWarnings("unchecked")

Аннотация в начале вашего метода.

2 голосов
/ 31 августа 2009

Этот вариант должен быть в порядке

List <DLPFile> files = (List <DLPFile>) session.get("fileslist"); 

Несмотря на то, что вы получите непроверенное предупреждение, так как я не ожидаю, что ваша сессия будет Map<String, List<DLPFile>>.

Просмотрите часто задаваемые вопросы по Java Generics http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html

2 голосов
/ 31 августа 2009

Знаете ли вы, что вам не хватает> в начале? то есть «List « files ».

1 голос
/ 31 августа 2009

Первый опробованный вами вариант - тот, который вам нужен:

List<DLPFile> files = (List<DLPFile>) session.get("fileslist");

Первое предупреждение, которое вы получаете, не имеет ничего общего с генериками: вы получите предупреждение, например, при String. Компилятор просто говорит вам, что он не может гарантировать, что возвращаемый объект является List<DLPFile>.

Второй, о необработанном типе, имеет отношение к генерикам. Если вы используете опцию выше, вы не должны получить ее, но если вы приведете просто к List, вы получите ее. Он говорит вам, что вы не должны использовать List без параметра типа, в вашем случае <DLPFile>.

0 голосов
/ 31 августа 2009

Как уже говорили другие, в Java нельзя безопасно приводить универсальные типы.

Вместо того, чтобы игнорировать компилятор, лучший способ решить эту проблему - добавить что-то более значимое в сеанс. Оберните List в классе, который обрабатывает этот тип коллекции типа. Черт возьми, даже добавь несколько методов экземпляра, которые делают что-то значимое со списком, а не метод getFiles.

...