如何修复不安全的操作?

时间:2017-05-18 13:01:23

标签: java

这是我最近项目的一个非常简单的版本,它演示了这个问题:

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());时,编译器没有返回该消息,但显然这会破坏我的项目。

什么是未经检查或不安全的操作,我该如何解决?

2 个答案:

答案 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()非原始。