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

例如:

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

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

为了摆脱这个警告,只要具体说明你正在存储在集合中的什么types的对象。 所以,而不是

 List myList = new ArrayList(); 

使用

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

在Java 7中,您可以使用Type Inference来缩短一般的实例化。

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

如果您按照build议进行操作并使用“-Xlint:unchecked”开关进行重新编译,则会提供更详细的信息。

除了使用原始types(如其他答案所述),未经检查的转换也会导致警告。

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

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

这个警告意味着你的代码在一个原始types上运行,重新编译这个例子

 -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

例如,当您调用返回generics集合的函数时,您不需要自己指定generics参数。

为一个function

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

会产生这个错误。

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

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

如果我没有记错的话,当java添加generics时 ,会添加“未经检查或不安全的操作”警告。 通常要求你以某种方式更加明确types。

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

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

下面是一个简短(有点愚蠢)的例子来演示:

 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的对象。 这必须转换为实际types,但这是一个未经检查的转换。

解决的办法是像ArrayList那样在<>中使用特定的types。

例:

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

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

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

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