2012-05-18 4 views
0

나는 제네릭을 둘러싼 유형의 삭제에 대한 이해하지만,이 코드는 오류 발생 없음을 찾기 위해 여전히 놀랐습니다 : 대부분생성자를 호출 할 때 제네릭 형식이 필요하지 않은 이유는 무엇입니까?

public class MyClass { 
    private final HashMap<ClassA,ClassB> hashMap; 

    public MyClass() { 
    this.hashMap = new HashMap<>(); 
    } 
} 

, 내가 자바 1.6와 이클립스의 자바 표준 버전을 사용하고, 일반 유형은을 자동 완성 된 생성자 이름을 선택할 때 자동 채워집니다. 현재 J2EE 버전의 Eclipse와 Java 1.7을 사용하고 있습니다. 코드가 컴파일되고 괜찮습니다. 그것은 완전히 중복 된 정보이므로 필요한 이유가 보이지 않습니다. 그러나 당신이 그것을 넣을 필요가 없다는 것이 단지 잘못된 것입니다.

왜 필요하지 않나요? 아니면 여기에 뭔가 빠져 있습니까?

+1

[향상된 다이아몬드 표기법] (http://docs.oracle.com/javase/7/docs/technotes/guides/language/type-inference-generic-instance-creation.html)은 Java 7의 새로운 기능입니다 – Perception

+0

자바 7이기 때문에. –

답변

4

실제로는 <>을 입력하여 "안녕하세요, 컴파일러, 저에게 도움이되고 선언문에 명시된대로 제네릭을 작성하십시오."라고 말합니다.

diamond operator이라고하며 Java 7의 새로운 기능입니다 (예 : this question on SO 또는 official tutorial

대신 this.hashMap = new HashMap();을 작성한 경우 컴파일러에서 경고를 보내야합니다 (일반적으로 경고가 표시됨).

+0

다른 질문을 읽고부터, 전체 시점은 생성자 인수의 컴파일 타임 제네릭 형식 검사를 트리거하는 것 같습니다. 우리는 타입이 무엇인지 알기 때문에 그것들을 지정할 필요는 없지만, 컴파일러는 체크 할 필요가있는 타입이 있다는 것을 알 수 있습니다. –

+0

예. 우리는 타입을 알고 있지만 generic 타입을 한 줄에 두 번 쓰는 것을 너무 게으른 것입니다. 다이아몬드의 유일한 목적은, 내가 아는 한, 우리가 "다시 한 번 여기에 간다"라고 쓸 수있을 때 우리가 똑같은 것을 반복해서 타이핑하는 데 쓸 시간 (그리고 가독성)을 우리에게 남겨 두는 것이다. –

관련 문제