例如:

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

当前回答

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

-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

其他回答

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

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

List myList = new ArrayList();

use

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添加泛型时添加的,如果我没记错的话。它通常要求你以这样或那样的方式更明确地说明类型。

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

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

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

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

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

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

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