2009-09-18 2 views
2

Я получаю следующее предупреждение из моего кода 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, но это не имеет значения, он по-прежнему появляется.

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

+6

Можете ли вы предоставить немного больше своего кода, например, темп. –

ответ

3

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

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

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

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

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

6

Звонок get возвращает необработанный (не общий) ArrayList.

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

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

0

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

0

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

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

Чтобы улучшить ваш турникет немного вы могли бы перейти от ссылки на конкретный тип «ArrayList» к списку интерфейсов, изменив эти две строки выглядеть следующим образом:

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

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

Смежные вопросы