这是我最近项目的一个非常简单的版本,它演示了这个问题:
import java.util.List;
import java.util.ArrayList;
class Class{
List<Character> l1 = new ArrayList<>();
List<Character> l2 = new ArrayList<>();
List getList(){
return l1;
};
void setList(){
l2.clear();
l2.addAll(getList());
};
}
class Main{
public static void main(String[]args){
Class object = new Class();
object.setList();
};
}
编译时,编译器说:
注意:Class.java使用未经检查或不安全的操作。注意:重新编译 with -Xlint:取消选中以获取详细信息。
当我离开l2.addAll(getList());
时,编译器没有返回该消息,但显然这会破坏我的项目。
什么是未经检查或不安全的操作,我该如何解决?
答案 0 :(得分:1)
而不是
List getList(){
指定类型参数,例如
List<Character> getList(){
之前,您正在返回原始类型,而不是通用类型。
答案 1 :(得分:0)
尝试遵循编译器的建议:
$ javac -Xlint:unchecked Class.java
Class.java:11: warning: [unchecked] unchecked method invocation: method addAll in interface List is applied to given types
l2.addAll(getList());
^
required: Collection<? extends E>
found: List
where E is a type-variable:
E extends Object declared in interface List
Class.java:11: warning: [unchecked] unchecked conversion
l2.addAll(getList());
^
required: Collection<? extends E>
found: List
where E is a type-variable:
E extends Object declared in interface List
2 warnings
这清楚地表明,未经检查的转化是因为您传递的List
需要Collection<? extends E>
。
因此,您可以通过将List
的类型更改为List<E>
(或List<? extends E>
)来解决此问题;换句话说,使返回类型为getList()
非原始。