Как мне избавиться от этого предупреждения? - PullRequest
2 голосов
/ 18 сентября 2009

Я получаю следующее предупреждение из моего кода Java:

Lexer.java:591: warning: [unchecked] unchecked conversion
found   : java.util.ArrayList
required: java.util.ArrayList<java.lang.Integer>
ArrayList<Integer> tempArray = temp.get(theToken);

Я пытался привести его к ArrayList, но это не имеет значения, оно все равно появляется.

Как мне от этого избавиться?

Ответы [ 4 ]

6 голосов
/ 18 сентября 2009

Вызов get возвращает необработанный (неуниверсальный) ArrayList.

Недостаточно контекста, чтобы предложить лучший подход. Метод get можно изменить, чтобы объявить его тип возвращаемого значения как List<Integer>. Если temp является Map, обратитесь к нему с соответствующими аргументами универсального типа: Map<Token, List<Integer>>. Или, если вы не можете изменить тип возвращаемого значения, вы можете присвоить результат List<?> и преобразовать его содержимое в Integer при их использовании.

Обратите внимание, что я предлагаю List вместо ArrayList. В общем, API-интерфейсы с абстрактными типами - а не классы реализации, которые вы использовали - & mdash; обеспечивают гибкость в будущем.

3 голосов
/ 18 сентября 2009

ArrayList является коллекцией Java и может содержать объекты любого типа. Предполагается, что метод get для temp возвращает простой ArrayList, но вы указываете, что tempArray является ArrayList, содержащим только целые числа.

Если вы написали класс для temp, необходимо объявить метод get для возврата ArrayList<Integer>

Если вы этого не сделали, вам придется сделать tempArray простым ArrayList без универсального целого типа.

См. http://java.sun.com/docs/books/tutorial/java/generics/index.html для получения дополнительной информации об универсальных типах в Java.

При предупреждении - проверка общего типа в java выполняется только во время компиляции, она отсутствует во время выполнения (так называемое удаление типа).

0 голосов
/ 18 сентября 2009

Похоже, вам не хватает общего объявления для переменной temp. Я предполагаю, что temp - это карта (основанная на том факте, что она имеет метод get.) Если это так, то вы, вероятно, не полностью объявляете универсальные типы для этой карты. Если типом 'theToken' является String, то ваша карта отображается между String и ArrayList. Таким образом, декларация должна выглядеть примерно так:

Map<String, ArrayList<Integer>> temp = new HashMap<String, ArrayList<Integer>>();

Чтобы немного улучшить свой стиль, вы можете перейти от ссылки на конкретный тип 'ArrayList' к интерфейсу List, изменив эти две строки так:

Map<String, List<Integer>> temp = new HashMap<String, List<Integer>>();

Это позволяет сделать так, чтобы вы могли переходить из одного вида списка (например, ArrayList) в другой (например, Vector или LinkedList) без изменения какого-либо кода, который их использует.

0 голосов
/ 18 сентября 2009

Обычно это происходит потому, что тип возвращаемого значения из метода get () в объекте temp возвращает ArrayList без спецификации обобщений, в то время как tempArray является ArrayList из Integers. Потенциально ArrayList, назначенный tempArray во время выполнения, может содержать объекты, которые не являются целыми числами. Во время компиляции Java не может определить, какой тип объекта находится в ArrayList, возвращаемом get ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...