是什么导致javac发出“使用未经检查或不安全的操作”警告

时间:2008-10-13 15:27:29

标签: java generics warnings

例如:

javac Foo.java
Note: Foo.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.

12 个答案:

答案 0 :(得分:358)

如果您使用的是没有类型说明符的集合(例如,Arraylist()而不是ArrayList<String>()),则会出现在Java 5及更高版本中。这意味着编译器无法使用generics以类型安全的方式检查您是否正在使用该集合。

要消除警告,只需具体说明您在集合中存储的对象类型。所以,而不是

List myList = new ArrayList();

使用

List<String> myList = new ArrayList<String>();

在Java 7中,您可以使用Type Inference缩短通用实例化。

List<String> myList = new ArrayList<>();

答案 1 :(得分:180)

如果您执行建议并使用“-Xlint:unchecked”开关重新编译,它将为您提供更详细的信息。

除了原始类型的使用(如其他答案所述),未经检查的演员也会引起警告。

使用-Xlint进行编译后,您应该能够重新编写代码以避免出现警告。这并不总是可行的,特别是如果要与无法更改的遗留代码集成。在这种情况下,您可能决定在知道代码正确的地方禁止警告:

@SuppressWarnings("unchecked")
public void myMethod()
{
    //...
}

答案 2 :(得分:14)

此警告表示您的代码在原始类型上运行,使用

重新编译示例
-Xlint:unchecked 

获取详细信息

像这样:

javac YourFile.java -Xlint:unchecked

Main.java:7: warning: [unchecked] unchecked cast
        clone.mylist = (ArrayList<String>)this.mylist.clone();
                                                           ^
  required: ArrayList<String>
  found:    Object
1 warning

docs.oracle.com在这里讨论它: http://docs.oracle.com/javase/tutorial/java/generics/rawTypes.html

答案 3 :(得分:9)

对于Android Studio,您需要添加:

allprojects {

    gradle.projectsEvaluated {
        tasks.withType(JavaCompile) {
            options.compilerArgs << "-Xlint:unchecked"
        }
    }

    // ...
}

在项目的build.gradle文件中,以了解在何处产生此错误。

答案 4 :(得分:5)

例如,当您调用返回Generic Collections的函数并且您自己未指定泛型参数时。

用于功能

List<String> getNames()


List names = obj.getNames();

会产生此错误。

要解决此问题,您只需添加参数

即可
List<String> names = obj.getNames();

答案 5 :(得分:5)

如果我没记错的话,当java添加Generics时会添加“未经检查或不安全的操作”警告。通常会要求您以某种方式更明确地表达类型。

例如。代码ArrayList foo = new ArrayList();会触发该警告,因为javac正在寻找ArrayList<String> foo = new ArrayList<String>();

答案 6 :(得分:3)

我有2年的上课和一些新课。我在Android Studio中解决了以下问题:

allprojects {

    gradle.projectsEvaluated {
        tasks.withType(JavaCompile) {
            options.compilerArgs << "-Xlint:unchecked"
        }
    }

}

在我的项目build.gradle文件(Borzh solution

然后,如果还剩下一些方法:

@SuppressWarnings("unchecked")
public void myMethod()
{
    //...
}

答案 7 :(得分:2)

我只是想添加一个我经常看到的那种未检查警告的例子。如果使用实现Serializable之类接口的类,通常会调用返回接口对象的方法,而不是实际的类。如果返回的类必须转换为基于泛型的类型,则可以获得此警告。

这是一个简短的(有点愚蠢的)示例:

import java.io.Serializable;

public class SimpleGenericClass<T> implements Serializable {

    public Serializable getInstance() {
        return this;
    }

    // @SuppressWarnings("unchecked")
    public static void main() {

        SimpleGenericClass<String> original = new SimpleGenericClass<String>();

        //  java: unchecked cast
        //    required: SimpleGenericClass<java.lang.String>
        //    found:    java.io.Serializable
        SimpleGenericClass<String> returned =
                (SimpleGenericClass<String>) original.getInstance();
    }
}

getInstance()返回一个实现Serializable的对象。这必须转换为实际类型,但这是一个未经检查的演员。

答案 8 :(得分:0)

解决方案是在<> ArrayList<File>中使用特定类型。

示例:

File curfolder = new File( "C:\\Users\\username\\Desktop");
File[] file = curfolder.listFiles();
ArrayList filename = Arrays.asList(file);

上面的代码生成警告,因为ArrayList不是特定类型。

File curfolder = new File( "C:\\Users\\username\\Desktop");
File[] file = curfolder.listFiles();
ArrayList<File> filename = Arrays.asList(file);

上面的代码会很好。只有更改在ArrayList之后的第三行。

答案 9 :(得分:0)

您可以将其保留为通用形式,并写为:

// list 2 is made generic and can store any type of Object
        ArrayList<Object> list2 = new ArrayList<Object>();

将ArrayList的类型设置为Object可以给我们带来存储任何类型数据的优势。您不需要使用-Xlint或其他任何东西。

答案 10 :(得分:0)

由于

也可能引发此警告

新的HashMap()或新的通用类型ArrayList()必须是特定类型,否则编译器将生成警告。

请确保如果您的代码包含以下内容,则必须进行相应的更改

new HashMap()=>地图map = new HashMap() new HashMap()=>地图map = new HashMap <>()

new ArrayList()=>列表映射= new ArrayList() new ArrayList()=>列表映射= new ArrayList <>()

答案 11 :(得分:0)

我有<FormEx submitAction={console.log("submit")} /> 。因为ArrayList<Map<String, Object>> items = (ArrayList<Map<String, Object>>) value;是一个复杂的结构(我想clean JSON),所以在数字,布尔值,字符串,数组上可能会发生任何组合。因此,我使用了@Dan Dyer的解决方案:

value