2009-12-03 2 views
21

잘못된 비트를 추가하는자바 경고 : 선택하지 않은 호출 코드 (E)

Vector moves = new Vector(); 

moves.add(new Integer(x)); 

오류 :

ConnectFour.java:82: warning: [unchecked] unchecked call to add(E) as a member of the raw type java.util.Vector moves.add(new Integer(x)); 

이 같은 오류에 필요한 얼마나 많은 정보를 원하시면 정말 확실하지 .. ..

+6

참고로 경고가 아닙니다. 단지 경고입니다. 경고를 신경 쓰지 않는다면 위와 같이하는 것이 여전히 완벽합니다. – Joel

답변

28

위의 코드는 generics을 사용하지 않는 것이 문제입니다.

다음은 작동합니다

Vector<Integer> moves = new Vector<Integer>(); 

move.add(new Integer(x)); 

<> 내부의 유형 이름은 (Vector의 경우, 보유 할 요소의 유형 매개 변수 E은)는 기대해야 어떤 유형의 객체 컴파일러를 알려줍니다.

StringVector<Integer>을 추가하려고하면이 경우와 같이 지정된 유형의 객체를 추가하려고하면 컴파일 타임 오류가 발생하여 객체 유형이 예상 유형의가 추가됩니다.

그렇다면 Vector 클래스를 사용하지 말아야한다는 것입니다. 더 많은 목적을 위해 Java Collections Framework에서 ArrayList과 같은 List을 구현하는 클래스로 충분하고 성능이 우수합니다. 직접 제네릭에 대한 질문에 관련되지는 않지만

편집

, 아담 Paynter 자동 복싱의 사용에 대한 코멘트에 좋은 점을 가져왔다.

Java 5 이후로, 프리미티브와 그 래퍼 클래스, 예를 들어. intInteger은 필요에 따라 자동으로 서로 변환됩니다.

오류가 아니다
Vector<Integer> v = new Vector<Integer>(); 
v.add(5); // Not necessary to use an Integer value. 
+1

+1. 또한 Java 5 이상에서 컴파일되고있는 것 같습니다. 이 때문에 그들은 자동 권투를 이용할 수도 있습니다 :'move.add (x);' –

4

, 그냥 컴파일러 경고입니다 :

따라서 기대 int 나 클래스에 리터럴 int로 지정된 값 Integer을 추가 할 수 있습니다. 벡터는 대개 제네릭을 사용하므로 경고 없애, parametized된다

Vector<Integer> moves = new Vector<Integer>(); 
moves.add(new Integer(x)); 
1
  1. 이 바람직 java.util.ArrayList을 사용하여이

    Vector<Integer> moves = new Vector<Integer>(); 
    
  2. 처럼 벡터를 초기화 - 그것은 Vector

    의 교체입니다
3

비 제너릭 데이터 구조를 사용할 수밖에없는 경우 방법을 시작할 때 @SuppressWarnings("unchecked")을 입력하여 경고를 음소거 할 수 있습니다.

비약적인 벡터를 사용하는 것 외에는 선택의 여지가없는 경우에만 수행됩니다. 이는 보통 이전 라이브러리 또는 Java 런타임 라이브러리의 특정 부분으로 작업 할 때 발생합니다.

0

직접 코드 관련하지만 recommended는 (버전> = 5 점)를 사용하려는 것이다 :

Integer.valueOf(x); 

대신

new Integer(x); 

의 때문에 어떤 정수 값 {-128, ..., 127)은 이고, 캐시 된 값은이며 항상 동일한 개체를 반환합니다. 특히 autoboxing과 관련하여 매우 유용합니다.

관련 문제