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

too*_*ear 267 java generics warnings

例如:

javac Foo.java
Note: Foo.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
Run Code Online (Sandbox Code Playgroud)

Bil*_*ard 372

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

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

List myList = new ArrayList();
Run Code Online (Sandbox Code Playgroud)

使用

List<String> myList = new ArrayList<String>();
Run Code Online (Sandbox Code Playgroud)

在Java 7中,您可以使用类型推断缩短通用实例化.

List<String> myList = new ArrayList<>();
Run Code Online (Sandbox Code Playgroud)

  • @Lucio你还需要尖括号.`new ConcurrentHashMap <>()` (13认同)
  • 需要指出的是,这不是特定于集合的.您收到错误,因为Java编译器通常无法确保类型安全.例如,使用以下代码生成相同的警告:AbstractMap.SimpleEntry <String,String> entry = new AbstractMap.SimpleEntry("hello","world"); (3认同)

Dan*_*yer 186

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

除了原始类型的使用(如其他答案所述),未经检查的强制转换也可能导致警告.

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

@SuppressWarnings("unchecked")
public void myMethod()
{
    //...
}
Run Code Online (Sandbox Code Playgroud)

  • 我希望更多的人能够回答这个问题.我支持我选择@Bill the Lizard的答案,但这个答案非常接近我的心,因为我告诉我答案是在警告本身正面看着我,并详细阐述了遇到错误的另一个原因. (12认同)
  • 这是终极答案! (2认同)
  • 在 Android studio 中的哪里可以启用或编写此开关? (2认同)

Sug*_*lai 15

此警告意味着您的代码在原始类型上运行,使用.重新编译示例

-Xlint:unchecked 
Run Code Online (Sandbox Code Playgroud)

得到细节

像这样:

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
Run Code Online (Sandbox Code Playgroud)

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


Bor*_*rzh 15

对于Android Studio,您需要添加:

allprojects {

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

    // ...
}
Run Code Online (Sandbox Code Playgroud)

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


Osk*_*kar 6

我有 2 岁的课程和一些新课程。我在 Android Studio 中解决了它,如下所示:

allprojects {

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

}
Run Code Online (Sandbox Code Playgroud)

在我的项目 build.gradle 文件中(Borzh 解决方案

然后如果还剩下一些 Metheds:

@SuppressWarnings("unchecked")
public void myMethod()
{
    //...
}
Run Code Online (Sandbox Code Playgroud)


Mat*_*att 5

例如,当您调用返回通用集合的函数并且您自己未指定通用参数时.

一个功能

List<String> getNames()


List names = obj.getNames();
Run Code Online (Sandbox Code Playgroud)

将生成此错误.

要解决它,您只需添加参数

List<String> names = obj.getNames();
Run Code Online (Sandbox Code Playgroud)


Rya*_*yan 5

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

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