2009-09-18 10 views
2

내 자바 코드에서 다음과 같은 경고를 받고 오전 :이 경고는 어떻게 제거합니까?

나는 위해 ArrayList 캐스팅하려했지만이 문제가되지 않습니다
Lexer.java:591: warning: [unchecked] unchecked conversion 
found : java.util.ArrayList 
required: java.util.ArrayList<java.lang.Integer> 
ArrayList<Integer> tempArray = temp.get(theToken); 

, 여전히 나타납니다.

어떻게 제거하나요?

+6

temp와 같은 코드를 조금 더 제공 할 수 있습니까? –

답변

3

ArrayList는 Java Collection이며 모든 유형의 객체를 수용 할 수 있습니다. 임시 메서드의 get 메서드는 아마도 일반 ArrayList를 반환하도록 선언되어 있지만 tempArray는 정수 만 포함하는 ArrayList가됩니다. 당신이 온도의 클래스를 썼다면

는 get 메소드는 다음 정수의 제네릭 형식없이 tempArray에게 일반의 ArrayList를해야 할 것이다하지 않은 경우 ArrayList<Integer>

을 반환 선언 될 필요가있다.

Java의 제네릭 형식에 대한 자세한 내용은 http://java.sun.com/docs/books/tutorial/java/generics/index.html을 참조하십시오.

주의 사항 - Java의 제네릭 형식 검사는 컴파일 타임 전용이며 런타임에 존재하지 않습니다 (소위 지우개라고 함).

6

get을 호출하면 원시 (일반형) ArrayList이 반환됩니다.

최상의 접근 방식을 제시하기에 충분한 컨텍스트가 제공되지 않았습니다. get 메서드는 반환 유형을 List<Integer>으로 선언하도록 수정할 수 있습니다. tempMap 인 경우 올바른 일반 유형 인수 인 Map<Token, List<Integer>>을 사용하여 참조하십시오. 또는 반환 유형을 수정할 수없는 경우 결과를 List<?>에 할당하고 콘텐츠를 사용할 때 그 콘텐츠를 Integer으로 전송할 수 있습니다.

ArrayList 대신 List을 제안합니다. 일반적으로 사용하는 구현 클래스가 아닌 추상 유형이 — 인 API는 —을 사용하여 향후 유연성을 보장합니다.

0

이것은 대개 temp 개체가 Integers의 ArrayList 인 동안 temp 개체의 get() 메서드에서 반환되는 형식이 generics 사양없이 ArrayList를 반환하기 때문에 발생합니다. 잠재적으로 런타임 중에 tempArray에 할당 된 ArrayList에 정수가 아닌 객체가 포함될 수 있습니다. 컴파일 시간 동안 Java는 get()에 의해 반환 된 ArrayList에있는 객체의 유형을 판별 할 수 없습니다.

0

임시 변수에 대한 일반적인 선언이 누락 된 것 같습니다. 나는 temp가 map이라는 것을 가정 할 것이다. (get 메소드를 가지고 있다는 사실에 기반한다.)이 경우,이 맵을위한 generic 타입을 완전히 선언하지는 않을 것이다. 'theToken'의 유형이 String 인 경우 맵은 String과 ArrayList 사이의 매핑 인 것 같습니다.

Map<String, ArrayList<Integer>> temp = new HashMap<String, ArrayList<Integer>>(); 

는 다음과 같이 당신의 회전식 당신이 그 두 줄을 변경하여 인터페이스 목록에 특정 유형 '의 ArrayList'을 참조로 전환 할 수있는 약간의 향상을 위해 :

같은 그것의 선언은 다음과 같이 될 것이다으로
Map<String, List<Integer>> temp = new HashMap<String, List<Integer>>(); 

이렇게하면 어떤 종류의 목록 (ArrayList와 같은)에서 다른 목록 (Vector 또는 LinkedList와 같이)을 사용할 수있는 코드를 변경하지 않고 변경할 수 있습니다.

관련 문제