我如何摆脱这个警告?

时间:2009-09-18 16:13:40

标签: java warnings

我从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 个答案:

答案 0 :(得分:6)

get的调用会返回原始(非通用)ArrayList

没有足够的背景来提出最好的方法。可以修改get方法以将其返回类型声明为List<Integer>。如果tempMap,请使用正确的泛型类型参数引用它:Map<Token, List<Integer>>。或者,如果您无法修改返回类型,则可以将结果分配给List<?>,并在使用时将其内容强制转换为Integer

请注意,我建议List而不是ArrayList。一般来说,具有抽象类型的API(而不是您碰巧使用的实现类)确保了未来的灵活性。

答案 1 :(得分:3)

ArrayList是一个Java Collection,可以容纳任何类型的对象。 temp的get方法可能被声明为返回一个普通的ArrayList,但是你指定tempArray是一个只保存整数的ArrayList。

如果你为temp编写了类,则需要声明get方法返回一个 ArrayList<Integer>

如果没有,那么你必须使tempArray成为一个没有泛型整数的普通ArrayList。

有关Java中泛型类型的更多信息,请参阅http://java.sun.com/docs/books/tutorial/java/generics/index.html

警告 - java中的泛型类型检查只是编译时间,它在运行时不存在(所谓的类型擦除)。

答案 2 :(得分:0)

这通常是因为temp对象中的get()方法的返回类型返回没有泛型规范的ArrayList,而tempArray是Integers的ArrayList。在运行时分配给tempArray的ArrayList可能包含非整数的对象。在编译期间,Java无法确定get()返回的ArrayList中的对象类型。

答案 3 :(得分:0)

看起来你错过了temp变量的泛型声明。我假设temp是一个map(基于它有一个get方法的事实。)如果是这种情况,那么你可能没有完全声明这个map的泛型类型。如果'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),而无需更改任何使用它们的代码。