我从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但这没关系,它仍然出现。
我怎样摆脱这个?
答案 0 :(得分:6)
对get
的调用会返回原始(非通用)ArrayList
。
没有足够的背景来提出最好的方法。可以修改get
方法以将其返回类型声明为List<Integer>
。如果temp
是Map
,请使用正确的泛型类型参数引用它: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),而无需更改任何使用它们的代码。