답변:
유형 지정자없이 컬렉션을 사용하는 경우 (예 : Arraylist()
대신 ArrayList<String>()
) Java 5 이상에서 발생합니다 . 컴파일러가 generics를 사용하여 형식이 안전한 방식으로 컬렉션을 사용하고 있는지 확인할 수 없음을 의미합니다 .
경고를 없애려면 컬렉션에 어떤 유형의 객체를 저장하고 있는지 구체적으로 지정하십시오. 그래서 대신
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
나는 2 살짜리 수업과 새로운 수업이있었습니다. Android Studio에서 다음과 같이 해결했습니다.
allprojects {
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs << "-Xlint:unchecked"
}
}
}
내 프로젝트 build.gradle 파일에서 ( Borzh 솔루션 )
그리고 일부 미신이 남는 경우 :
@SuppressWarnings("unchecked")
public void myMethod()
{
//...
}
나는 자주 볼 수있는 점검되지 않은 경고의 한 가지 예를 추가하고 싶습니다. 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을 구현하는 객체를 반환합니다. 실제 유형으로 캐스트해야하지만 이것은 확인되지 않은 캐스트입니다.
해결책은 <>
과 같은 특정 유형을 사용하는 것 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
.
이 경고는
제네릭 형식 인 new HashMap () 또는 new ArrayList ()는 특정해야합니다. 그렇지 않으면 컴파일러가 경고를 생성합니다.
코드에 다음이 포함되어 있으면 그에 따라 변경해야합니다.
new HashMap () =>지도 맵 = new HashMap () new HashMap () =>지도 맵 = new HashMap <> ()
new ArrayList () => 목록 맵 = new ArrayList () new ArrayList () => 목록 맵 = new ArrayList <> ()
sun.misc.Unsafe
출력에 이러한 힌트를 제공합니다