2013-03-01 2 views
8

현재 Java OCA 시험을 위해 공부 중이며 ArrayList 선언과 관련된 질문이 있습니다. 내 책에 따르면Java ArrayList 선언

유효 다음의

?

1. ArrayList al1 = new ArrayList(); 
2. ArrayList al2 = new ArrayList<>(); 
3. ArrayList<> al3 = new ArrayList<>(); 
4. ArrayList<Double> al4 = new ArrayList<>(); 
5. ArrayList<Double> al5 = new ArrayList<Float>(); 

는 1, 2, 4가 유효 응답합니다. 답변 3과 5는 유효하지 않습니다.

그러나 적절한 설명이 제공되지 않습니다. 그것은하지 모든는 ArrayList를 선언하는 표준 방법을 보여입니다 :

ArrayList<E> al3 = new ArrayList<E>(); 

를하고 일반 부분없이 ArrayList를 선언하는 것이 유효하다고 언급하고있다.

나는 또한 온라인에서이 주제에 대한 적절한 기사를 찾을 수 없습니다. 위의 다른 순열을 다른 사람이 설명 할 수 있습니까?

미리 감사드립니다.

+2

일부 제네릭은 SO 포맷으로 먹었습니다. – Vlad

+0

감사합니다. 매우 혼란 스러웠습니다 : P – cowls

+0

3.'<>'는'diamond operator'라고 불리며'java7'과 함께 도입되었습니다. 그것은 일반 객체를 설치하기위한 지름길이기 때문에 변수 선언에 이미 지정되어 있으므로'new'를 사용할 때 다시 타입을 지정할 필요가 없습니다. – A4L

답변

14

1은 자바

의 모든 버전

다음은 제네릭을 사용하지 않고 ArrayList를 선언하는 유효합니다. 이것은 arraylist에 무엇을 추가하든 상관없이, 다시 되돌릴 때 유형이 Object이고 유형으로 변환해야한다는 것을 의미합니다. 이것은 Java 1.4 (이전 제네릭)에서 Collections를 사용하는 오래된 방법이며 이전 버전과의 호환성을 위해 지원됩니다. 요즘에는 항상 제네릭을 사용해야합니다. > < 두 번 유형을 지정할 필요가 없습니다 의미 Java7의 새로운 유형의 추론은 다음과 같습니다


2와 4는

빈 괄호

자바 7에서 유효합니다. 참고 Java7, 이전 버전에서는 작동하지 않습니다. 당신이 사용하는 경우 때문에 http://docs.oracle.com/javase/tutorial/java/generics/genTypeInference.html


3가 잘못되었습니다

그래서 Java7에서

ArrayList<Double> al4 = new ArrayList<>(); 

이 링크 타입 추론에 대한 더 많은 정보를 가지고

ArrayList<Double> al4 = new ArrayList<Double>(); 

과 동일 제네릭에서는 변수 선언에 유형을 지정해야합니다. 이 유형의 목록을 선언 할 경우 다음을 float 형입니다 목록을 할당 할 수 없습니다 두 배로 때문에


5, 당신은 단지 그것을 두 번 유형의 목록을 지정할 수 있습니다 유효하지 않습니다.

그래서이 유효 할 것 : 2 아래

ArrayList<Double> al5 = new ArrayList<Double>(); 
+0

답장을 보내 주셔서 감사합니다. 나는 이제 시험에 나오면 비슷한 질문을 처리 할 수 ​​있다고 확신한다. – user2123069

+0

문제 없습니다, 시험에 좋은 행운을 빕니다. – cowls

2

유효 only in Java SE7 될 것입니다. Java SE7은 유형 유추를 허용하므로 <> 내부에 유형을 제공 할 필요가 없습니다.하나 아래 한편

ArrayList<Double> al4 = new ArrayList<>(); 
    ArrayList al2 = new ArrayList<>(); 

all Java versions에 유효하다; 이것은 비 제네릭 코드의 하위 호환성을 보장하기위한 것입니다.

다음
ArrayList al1 = new ArrayList(); 

가 부동의 컬렉션으로 허용되지 않는 것은 이중 모음의 하위 유형이 아닙니다. 또한 Float은 Double의 하위 유형이 아닙니다. 그래서 그것의 질문은 유효한 선언입니다. 배열 버전도 컴파일되지 않습니다. 한 다음

Double[] dd = new Float[5]; //won't compile 
ArrayList<Double> al5 = new ArrayList<Float>(); //won't compile 

유효한 선언하지 않습니다.

ArrayList<> al3 = new ArrayList<>();