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

例如:

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

如果你使用的集合没有类型说明符(例如,Arraylist()而不是ArrayList<String>()),这将在Java 5及以后版本中出现。这意味着编译器不能检查你是否以类型安全的方式使用集合,使用泛型

要消除警告,需要明确在集合中存储的对象类型。所以,与其

List myList = new ArrayList();

使用

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

在Java 7中,你可以通过使用类型推断来缩短泛型实例化。

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

例如,当你调用一个返回泛型集合的函数时,你不自己指定泛型参数。

对于一个函数

List<String> getNames()




List names = obj.getNames();

将生成此错误。

要解它,你只需要加上参数

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

“未检查或不安全操作”警告是在java添加泛型时添加的,如果我没记错的话。它通常要求你以这样或那样的方式更明确地说明类型。

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

如果你按照它所建议的去做,并使用“-Xlint:unchecked”开关重新编译,它将为你提供更详细的信息。

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

一旦你用-Xlint进行了编译,你应该能够重做你的代码来避免这个警告。这并不总是可行的,特别是当您正在集成无法更改的遗留代码时。在这种情况下,你可以决定在你知道代码是正确的地方取消警告:

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

此警告意味着您的代码在原始类型上操作,请使用

-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 < / p >

解决方案是在<>中使用特定的类型,如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);

上面的代码就可以了。只有change在ArrayList之后的第三行。

我只是想再举一个我经常看到的未检查警告的例子。如果使用实现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的对象。必须将此类型转换为实际类型,但这是未检查的类型转换。

对于Android Studio,你需要添加:

allprojects {


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


// ...
}

在项目的构建中。Gradle文件来了解这个错误是在哪里产生的。

你可以保持它的一般形式,并将其写成:

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

ArrayList的类型设置为Object使我们能够存储任何类型的数据。你不需要使用-Xlint或其他任何东西。

我上了两年前的课,也上了一些新课。我在Android Studio中解决了这个问题:

allprojects {


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


}

在我的项目构建中。gradle文件(Borzh解决方案)

如果还剩下一些methods:

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

此警告也可能引发,因为new HashMap()new ArrayList()是泛型类型,必须是特定的,否则编译器将生成警告。

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

new HashMap() => Map<String,Object> map = new HashMap<String,Object>()
new HashMap() => Map<String,Object> map = new HashMap<>()


new ArrayList() => List<String,Object> map = new ArrayList<String,Object>()
new ArrayList() => List<String,Object> map = new ArrayList<>()

我有ArrayList<Map<String, Object>> items = (ArrayList<Map<String, Object>>) value;。因为value是一个复杂的结构(我想干净的JSON),可以发生数字、布尔值、字符串、数组的任何组合。所以,我使用了@Dan Dyer的解决方案:

@SuppressWarnings("unchecked")
ArrayList<Map<String, Object>> items = (ArrayList<Map<String, Object>>) value;