[英]How do I get rid of this warning?
我从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,但这没关系,它仍然出现。
我怎么能摆脱这个?
对get
的调用返回一个原始(非泛型) ArrayList
。
没有足够的背景来提出最好的方法。 可以修改get
方法以将其返回类型声明为List<Integer>
。 如果temp
是Map
,请使用正确的泛型类型参数引用它: Map<Token, List<Integer>>
。 或者,如果无法修改返回类型,则可以将结果分配给List<?>
,并在使用它们时将其内容强制转换为Integer
。
请注意,我建议使用List
而不是ArrayList
。 通常声明,具有抽象类型的API(而不是您碰巧使用的实现类)确保了未来的灵活性。
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中的泛型类型检查只是编译时间,它在运行时不存在(所谓的类型擦除)。
这通常发生是因为temp对象中的get()方法的返回类型返回没有泛型规范的ArrayList,而tempArray是Integers的ArrayList。 在运行时分配给tempArray的ArrayList可能包含非整数的对象。 在编译期间,Java无法确定get()返回的ArrayList中的对象类型。
看起来你错过了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),而无需更改任何使用它们的代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.