Правильное использование Arraylist и Java Generics vs Vectors

Я использовал векторы в прошлом и хорошо с ними знаком. Я слышал, что ArrayLists быстрее и гибче. Я новичок в использовании ArrayList и Java Generics. В настоящее время я использую их следующим образом и получаю предупреждение о параметризации (что, как мне казалось, я сделал, объявив их <String>.

ArrayList<String> arrayList = new ArrayList <String> ();
...
//then within a method
arrayList.add(file.getName()); //<-This line triggers the warning.

Я нашел в Интернете, что этого можно избежать, подавляя предупреждения в методе, как вы можете видеть ниже. Однако это обходной путь, и я предпочел бы узнать, как работают массивы, и использовать их правильно, а не подавлять предупреждения об их неправильном использовании.

@SuppressWarnings("unchecked")

И, пожалуйста, если есть какое-то соглашение или стандарты в отношении использования ArrayLists, я бы тоже хотел узнать о них.

EDIT: я получаю следующее предупреждение: Безопасность типов: метод add(Object) принадлежит необработанному типу ArrayList. Ссылки на общий тип ArrayList должны быть параметризованы


person slimbo    schedule 24.12.2009    source источник
comment
Можете ли вы показать весь метод (или хотя бы объявление), в котором выдается предупреждение.   -  person notnoop    schedule 24.12.2009
comment
Я работаю над исследовательским проектом, и поэтому я не хочу отображать какой-либо проприетарный код. Я знаю, что это усложняет задачу :(   -  person slimbo    schedule 24.12.2009
comment
Если вы сделаете string s = file.getName(); массивСписок.добавить (ы); вы все равно получите ошибку? Какую версию JDK вы используете?   -  person James Black    schedule 24.12.2009
comment
Я пробовал это раньше и снова (теперь, когда вы это предложили), и это не удаляет предупреждение.   -  person slimbo    schedule 24.12.2009
comment
Похоже, что file.getName() каким-то образом возвращает объект. Экземпляром какого класса является файл? Если вы добавляете (ы), вы получаете то же сообщение об ошибке?   -  person James Black    schedule 24.12.2009
comment
(javac в JDK7 (все еще находится в стадии разработки) имеет -Xlint:rawtypes, который будет отображать больше ошибок, что, возможно, упростит отслеживание такого рода проблем. Я думаю, что встроенный компилятор Netbeans уже имеет это предупреждение.)   -  person Tom Hawtin - tackline    schedule 24.12.2009
comment
Я использовал геттер и сеттер для передачи массива в метод (который я не включил в приведенный выше код). Геттер обращался к массиву, который я собирался закомментировать, а не к тому, что хотел. Я думаю, уже поздно, спасибо за всю вашу помощь.   -  person slimbo    schedule 24.12.2009


Ответы (4)


Во-первых, обратитесь к вашему списку (как к переменной, типу возвращаемого значения или типу параметра) по имени интерфейса:

List<String> list = new ArrayList<String>();

Плохой тон — привязывать свой код к конкретной реализации.

В Vectors нет ничего плохого. В основном это ArrayLists, где все методы синхронизированы. Это может создать ненужные накладные расходы, но не чрезмерно.

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

List list = new ArrayList<String>();
list.add("boo");

Поэтому всегда включайте соответствующий универсальный тип всякий раз, когда вы используете список в качестве типа возвращаемого значения, типа переменной или типа параметра.

Некоторые библиотеки могут не предоставлять вам эту возможность, но это должны быть единственные обстоятельства, при которых вам необходимо подавлять непроверенные предупреждения.

person cletus    schedule 24.12.2009
comment
Мне нужно увидеть более полный фрагмент кода, чтобы объяснить вам, почему вы получаете это предупреждение. Либо вы передаете объект, не относящийся к универсальному типу, либо используете голый универсальный тип (т. е. список списка, а не список списка‹String›). - person cletus; 24.12.2009

Возможно, вы передаете arrayList методу, где сигнатура метода void method(ArrayList arrayList) или лучше void method(List arrayList), а компилятор вызывает непроверенное предупреждение. Вы должны изменить сигнатуру метода на void method(ArrayList<String> arrayList) или лучше void method(List<String> list)

person Chandra Patni    schedule 24.12.2009
comment
Я думаю, вы имеете в виду: вы должны изменить сигнатуру метода на method(ArrayList<String> arrayList) и в любом случае, что вы действительно должны изменить, как говорили другие, это method(List<String> list) - person MatrixFrog; 24.12.2009
comment
Вы имеете в виду void method(ArrayList<String> arrayList), или лучше void method(List<String> strs) - person Tom Hawtin - tackline; 24.12.2009
comment
(Похоже, что общий аргумент был в ответе, но подсветка синтаксиса интерпретировалась как HTML или иным образом игнорировалась. Отредактировал ответ с помощью backticks.) - person Tom Hawtin - tackline; 24.12.2009

Что такое предупреждение? Мне кажется, это нормально, хотя вам действительно следует кодировать его интерфейс, List.

person fastcodejava    schedule 24.12.2009

person    schedule
comment
Тогда единственная возможность, о которой я могу думать, это то, что описание переменной arrayList в вашем методе отличается от того, что вы показали здесь. Возможно ли, что в методе есть другое объявление переменной с тем же именем, и это маскирует показанное вами объявление. - person sateesh; 24.12.2009