2012-01-01 2 views
4

왜 컴파일러 문제를컴파일러 경고는 일반 유형을 선언 할 때

로 변수를 선언 경고를하지
List<? extends Object> list = new LinkedList(); 

경고 :

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

하지만

으로 변수를 선언 할 때이 경고를 발행 나던
List<?> list = new LinkedList(); 
+0

Checkout http://stackoverflow.com/questions/8683137/and-extends-object/8683314 제네릭으로 작업 할 때 꼭 읽어야 할 훌륭한 답변이있는 제네릭 튜토리얼 – Robin

+0

약 해지는 것이 없습니다 내 NetBeans 6.9.1에서 jdk 6으로 언급했듯이. – Lion

+0

IDE를 사용하지 않습니다. 명령 줄 프롬프트에서 컴파일 할 때 경고 메시지가 나타 납니까? – ziggy

답변

1

컴파일러가 이들을 동등한 것으로 취급하지 않는 이유를 설명 할 수는 없지만 그렇게하지 않는다면 필자는 왜 그렇게하지 않는지 설명하려고 시도 할 것입니다.

첫 번째 것 (List<? extends Object>)은 List에 보관 된 개체 유형이 Object에서 파생 된 알 수없는 유형임을 나타냅니다. 두 번째 것 (List<?>)은 덜 말한다. 목록에있는 객체의 유형을 알 수 없다는 것뿐입니다. 예상되지 않은 상위 ​​유형을 알 수없는 유형의 상한으로 언급하지 않습니다. 첫 번째 가정을 확인하기 위해

컴파일러는 주제에 아무것도 말하지 않는다 원시 형 LinkedList, 여기에 구축 된 List 예에서 개최 된 예상 유형에 대해 뭔가 말을 듣고 싶어. 그러나 인스턴스를 LinkedList<Object> 유형으로 구성하는 경우 적어도 공 변하기 이라는 인스턴스가 사용자의 주장과 일치 할 것이라는 점을 보장해야합니다. 즉,이 목록의 내용은 일종의 Object입니다.

Java의 모든 참조/비 기본형이 Object으로 확장되므로 List<? extends Object>List<?> 사이의 해석에는 차이가 없어야하기 때문에이 모든 것은 어리석은 것처럼 보입니다. 결국 두 번째 것은 언어 유형 시스템의 필수 단일 루트 구조 계층에 따라 첫 번째 것을 의미합니다.

2

이것은 형식 지정자없이 컬렉션을 사용하는 경우 Java 5 이상에서 제공됩니다 (예 : ArrayList<String>() 대신 Arraylist()). 컴파일러는 generics을 사용하여 형식을 사용하여 컬렉션을 사용하고 있는지 확인할 수 없습니다.

경고를 없애려면 컬렉션에 저장할 개체의 유형을 지정하십시오. 다음과 같이,

List<? extends Object> list = new LinkedList<Object>(); 

를 그 문을 수정한다면, 대신

List list = new ArrayList(); 

은 경고없이 때문에 컴파일 것, 귀하의 경우에는

List<String> list = new ArrayList<String>(); 

로해야한다 이제 제네릭 유형 (<Object>)을 사용하여 유형 안전성을 확보하고 있습니다.

+0

'새로운 LinkedList ();'컴파일되지 않음 – Robin

+0

선언에서 와일드 카드를 사용할 수 없다는 점을 제외하고는 .. – Voo

관련 문제