Answers:
如果您使用的是没有类型说明符的集合(例如,Arraylist()
而不是ArrayList<String>()
),则在Java 5及更高版本中会出现这种情况。这意味着编译器无法使用泛型以类型安全的方式检查您是否正在使用集合。
要摆脱警告,只需具体说明您要在集合中存储的对象类型。所以,代替
List myList = new ArrayList();
采用
List<String> myList = new ArrayList<String>();
在Java 7中,您可以使用Type Inference来缩短泛型实例化。
List<String> myList = new ArrayList<>();
ConcurrentHashMap<Integer, Object> objs = new ConcurrentHashMap()
new ConcurrentHashMap<>()
-Xlint:unchecked
与MAVEN
如果按照建议进行操作并使用“ -Xlint:unchecked”开关重新编译,它将为您提供更多详细信息。
除了使用原始类型(如其他答案所述)外,未经检查的强制类型转换也会引起警告。
使用-Xlint编译后,应该可以重新编写代码以避免警告。这并非总是可能的,尤其是当您与无法更改的旧代码集成时。在这种情况下,您可以决定在知道代码正确的地方禁止显示警告:
@SuppressWarnings("unchecked")
public void myMethod()
{
//...
}
对于Android Studio,您需要添加:
allprojects {
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs << "-Xlint:unchecked"
}
}
// ...
}
在项目的build.gradle文件中,以了解在何处产生此错误。
此警告意味着您的代码对原始类型进行了操作,请使用
-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
我只想添加一个我经常看到的未经检查的警告示例。如果使用实现诸如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的对象。必须将其强制转换为实际类型,但这是未经检查的强制转换。
解决的办法是在<>
like中使用特定类型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);
上面的代码会很好。唯一的变化是在之后的第三行ArrayList
。
您可以将其保留为通用形式,并写为:
// list 2 is made generic and can store any type of Object
ArrayList<Object> list2 = new ArrayList<Object>();
将ArrayList的类型设置为Object可以给我们带来存储任何类型数据的优势。您不需要使用-Xlint或其他任何东西。
由于以下原因也可能引发此警告
泛型类型的新HashMap()或新ArrayList()必须特定,否则编译器将生成警告。
请确保如果您的代码包含以下内容,则必须进行相应的更改
新HashMap()=>地图map =新HashMap()新HashMap()=>地图map =新HashMap <>()
new ArrayList()=>列表映射= new ArrayList()new ArrayList()=>列表映射= new ArrayList <>()
sun.misc.Unsafe
并在输出中给出了这些提示