繁体   English   中英

我如何摆脱这个警告?

[英]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> 如果tempMap ,请使用正确的泛型类型参数引用它: 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM