2013-11-21 3 views
3

친절하게도 왼쪽의 (변수 선언) 및 오른쪽 (객체 할당)에 일반 클래스를 제공해야하는 이유는 무엇입니까? 기술적으로 왼쪽 또는 오른쪽으로 건너 뛸 수 있습니다 (alist2 또는 aList2 참조). aList1과 비교하여 aList2 및 aList3의 단점은 무엇입니까?Java Generics 사용

ArrayList<String> aList1 = new ArrayList<String>(); 
ArrayList<String> aList2 = new ArrayList(); 
ArrayList   aList3 = new ArrayList<String>(); 

보너스 질문이 내 마음에 들었지만 컴파일됩니다.하지만 aList4 및 aList5는 무엇을 의미합니까?

ArrayList<String> aList4 = new ArrayList<>(); 
ArrayList<?>  aList5 = new ArrayList<String>(); 

감사합니다.

종류와 관련, 헤르만

+0

을 참조하지거야 나쁜 이유에 관해서는

하지만 aList3 당신이 설계 한 클래스의 제네릭에 대한 매우 도움이 될하지 않을 것입니다. 'ArrayList '을 가지고 있다고 가정 해 봅시다. aList3를 사용하면 어떤 항목을 Car에 넣어야합니다. 그 반대의 경우, 오른쪽에 제네릭이 없으면, 물건을 기술적으로 유효하게 추가하고 있지만'Person '타입의 객체를 저장하기위한 ArrayList에'Car' 타입의 객체를 추가하고 싶지는 않을 것입니다. – Compass

답변

1

첫 번째 목록은 자바 6에 대한 선언의 표준 버전 및 이전 버전, 새로운 ArrayList를에서 원시 유형을 잡는 피하기 위해. Java 7부터 두 번째 목록을 안전하게 사용할 수 있습니다.

제 3의 목록이 Java 7에서 안전한지 여부는 확실하지 않지만, 모든 것이 객체로 저장 될 것입니다 (원시 형식 문제). 또는 컴파일되지 않을 수도 있습니다.

네 번째 목록은 두 번째 목록과 본질적으로 동일하며 다섯 번째 목록은 세 번째 목록과 동일합니다.

편집 : 방금 테스트 한 세 번째 목록은 원시 형식을 반환하므로 반대하는 것이 좋습니다. 나는 또한 두 번째 목록에 ArrayList의 new 선언에 다이아몬드 연산자가 누락되어 있다는 사실을 놓쳤다.

+1

* Java 7부터는 두 번째 목록을 안전하게 사용할 수 있습니다. * aList2가 아니라'aList4'를 의미합니다. –

+0

아, 그래, 거기 다이아몬드 연산자의 부족, 한 순간을 놓쳤습니다. – Rogue

+0

두 번째리스트'aList2'는 Java 5 이후 경고와 함께 컴파일됩니다. –

3

ArrayList은 원시 형식입니다.

원시 타입의 사용은 레거시 코드의 호환성에 대한 양보로서 만 허용됩니다. Java 프로그래밍 언어에 제네릭을 도입 한 후에 작성된 코드에서 원시 유형을 사용하는 것은 권장하지 않습니다. Java 프로그램 언어의 장래의 버젼에서는 raw 형의 사용을 허가하지 않는 것이 가능합니다.

는 형식 매개 변수에 관계없이 모든 ArrayList의 수퍼 유형 인 와일드 카드 유형입니다. List의 요소 유형을 알 수 없으므로 일반 ArrayList보다 요소를 적게 처리 할 수 ​​있습니다. 예를 들어 null 이외의 항목을 추가 할 수는 없으며 목록에서 가져 오는 것은 Object 일뿐입니다.

ArrayList<>ArrayList<X>의 속기 표기입니다. 여기서 X은 할당의 왼쪽에있는 type 매개 변수로 바뀝니다. 즉, ArrayList<String> list = new ArrayList<>()은 완전히 ArrayList<String> list = new ArrayList<String>()과 같습니다. 다이아몬드 연산자는 Java 7 이상에서만 존재하며 컴파일러가 유형을 유추 할 정도로 똑똑한 장소에서만 사용할 수 있습니다. 그러나 이러한 상황에서는 일반적으로 제네릭을 사용하는 가장 정확하고 정교한 방식입니다.

0

귀하의 구현에 가장 적합한 Generic 클래스를 사용해야합니다. 즉, Collection을 사용해야하는 품목 컬렉션이있는 경우에만 주문을 유지해야하는 경우 List 인터페이스를 사용해야합니다.

프로그램 인터페이스가 아닌 구현 GoF

에 왜이 좋은 : 그 이유는 당신이해야한다는 것입니다? 왜냐하면 구현을 변경하는 것이 훨씬 쉽기 때문입니다. 앞으로 ArrayList에서 LinkedList로 변경하려고한다고 가정 해보십시오. 전화를 new ArrayList에서 new LinkedList으로 변경하는 것입니다. 자신의 코드에 대해서도 마찬가지입니다. 항상 데이터 객체가 아닌 클래스에 인터페이스를 사용하십시오. 이렇게하면 구현 대신 객체 간의 인터페이스에 대해 생각하게 될 것입니다. 먼저 코드를 엉망으로 만들지 말고 코드를 위반하지 않고 필요할 때마다 구현을 수정하십시오.

article for more info

왜 당신의 예에 유형을 추론하지 않는 나쁜? 주로 프로그램이 목록에 포함 된 유형을 알지 못하기 때문에 유형을 알거나 유형을 파악하여 해당 유형으로 유형을 변환해야합니다. aList2 더 전체 답을 말미암아 난 그냥이 discussion