2009-09-18 139 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

你可以提供更多的代码,比如什么是温度。 – 2009-09-18 16:17:19

回答

3

ArrayList是一个Java集合,可以容纳任何类型的对象。 temp的get方法大概被声明为返回一个普通的ArrayList,但是你指定的tempArray是一个只包含整数的ArrayList。

如果你写的类临时然后get方法需要被声明为返回一个 ArrayList<Integer>

如果你没有,那么你将不得不作出tempArray一个普通的ArrayList没有一个通用整数类型。有关Java中泛型类型的更多信息,请参阅http://java.sun.com/docs/books/tutorial/java/generics/index.html

On caveat - java中的通用类型检查仅仅是编译时,它在运行时不存在(所谓的类型擦除)。

6

致电get返回原始(非通用)ArrayList

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

请注意,我建议List而不是ArrayList。一般来说,使用抽象类型—的API而不是使用—的实现类可确保未来的灵活性。

0

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

0

它看起来像你缺少一个临时变量的通用声明。我会假定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),而无需更改任何使用它们的代码。