当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《是什么导致javac发出"使用未经检查或不安全的操作"警告》经验,为你挑选了6个好方法。

例如:

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

Bill the Liz.. 372

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

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

List myList = new ArrayList();

使用

List myList = new ArrayList();

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

List myList = new ArrayList<>();

@Lucio你还需要尖括号.`new ConcurrentHashMap <>()` (13认同)

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


Dan Dyer.. 186

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

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

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

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

我希望更多的人能够回答这个问题.我支持我选择@Bill the Lizard的答案,但这个答案非常接近我的心,因为我告诉我答案是在警告本身正面看着我,并详细阐述了遇到错误的另一个原因. (12认同)


Suganthan Ma.. 15

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

-Xlint:unchecked 

得到细节

像这样:

javac YourFile.java -Xlint:unchecked

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

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



1> Bill the Liz..:

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

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

List myList = new ArrayList();

使用

List myList = new ArrayList();

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

List myList = new ArrayList<>();


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

2> Dan Dyer..:

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

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

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

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


我希望更多的人能够回答这个问题.我支持我选择@Bill the Lizard的答案,但这个答案非常接近我的心,因为我告诉我答案是在警告本身正面看着我,并详细阐述了遇到错误的另一个原因.

3> Suganthan Ma..:

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

-Xlint:unchecked 

得到细节

像这样:

javac YourFile.java -Xlint:unchecked

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

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



4> Borzh..:

对于Android Studio,您需要添加:

allprojects {

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

    // ...
}

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



5> Matt..:

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

一个功能

List getNames()


List names = obj.getNames();

将生成此错误.

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

List names = obj.getNames();



6> Ryan..:

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

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

推荐阅读
牛尾巴2010
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有