질문 : Java 7에서 다이아몬드 연산자 (<>)의 요점은 무엇입니까?
Java 7의 다이아몬드 연산자는 다음과 같은 코드를 허용합니다.
List<String> list = new LinkedList<>();
그러나 Java 5/6에서는 간단히 다음과 같이 작성할 수 있습니다.
List<String> list = new LinkedList();
유형 삭제에 대한 나의 이해는 이것들이 정확히 동일하다는 것입니다. (어쨌든 제네릭은 런타임에 제거됩니다).
왜 다이아몬드에 신경을 쓰나요? 어떤 새로운 기능 / 유형 안전성이 허용됩니까? 새로운 기능이 생성되지 않으면 왜 기능으로 언급합니까? 이 개념에 대한 나의 이해에 결함이 있습니까?
답변
문제
List<String> list = new LinkedList();
왼쪽에서는 일반 유형 List<String>
을 사용하고 있으며 오른쪽에서는 원시 유형 LinkedList
사용하고 있습니다. Java의 원시 유형은 제네릭 이전 코드와의 호환성을 위해서만 존재하며 반드시 필요한 경우가 아니면 새 코드에서 사용해서는 안됩니다.
이제 Java가 처음부터 제네릭을 가지고 있고 제네릭을 갖기 LinkedList
와 같은 유형이없는 경우 제네릭 유형에 대한 생성자가 자동으로 유형 매개 변수를 추론하도록 만들 수 있었을 것입니다. 가능한 경우 과제의 왼쪽. 그러나 그렇지 않았으며 이전 버전과의 호환성을 위해 원시 유형과 제네릭 유형을 다르게 처리해야합니다. 따라서 유형 매개 변수를 반복 할 필요없이 일반 객체의 새 인스턴스를 선언 하는 약간 다르지만 똑같이 편리한 방법 인 다이아몬드 연산자를 만들어야합니다.
List<String> list = new LinkedList()
의 원래 예제에 관한 한 컴파일러는 해당 할당에 대한 경고를 생성합니다. 이걸 고려하세요:
List<String> strings = ... // some list that contains some strings
// Totally legal since you used the raw type and lost all type checking!
List<Integer> integers = new LinkedList(strings);
제네릭은 잘못된 작업을 수행하는 것에 대한 컴파일 타임 보호를 제공하기 위해 존재합니다. 위의 예에서 원시 유형을 사용하면이 보호 기능을 사용할 수 없으며 런타임에 오류가 발생합니다. 이것이 원시 유형을 사용해서는 안되는 이유입니다.
// Not legal since the right side is actually generic!
List<Integer> integers = new LinkedList<>(strings);
그러나 다이아몬드 연산자를 사용하면 할당의 오른쪽이 해당 매개 변수를 다시 입력 할 필요없이 왼쪽과 동일한 유형 매개 변수가있는 진정한 제네릭 인스턴스로 정의 될 수 있습니다. 원시 유형을 사용하는 것과 거의 동일한 노력으로 제네릭의 안전성을 유지할 수 있습니다.
이해해야 할 핵심은 원시 유형 ( <>
이없는)은 제네릭 유형과 동일하게 취급 될 수 없다는 것입니다. 원시 유형을 선언하면 제네릭의 이점과 유형 검사를받을 수 없습니다. 또한 제네릭은 Java 언어의 범용 부분 이라는 것을 명심해야 Collection
의 인수가없는 생성자에만 적용되는 것이 아닙니다!
출처 : https://stackoverflow.com/questions/4166966/what-is-the-point-of-the-diamond-operator-in-java-7
'프로그래밍 언어 > JAVA' 카테고리의 다른 글
Java에서 List를 Set로 변환하는 가장 쉬운 방법 (0) | 2021.09.29 |
---|---|
JAVA의 원시 유형은 무엇이며 왜 사용하지 않아야 하는가? (0) | 2021.09.27 |
Java의 "final" 의 작동 원리 (0) | 2021.09.15 |
AngularJS에서 데이터 바인딩의 작동 원리 (0) | 2021.09.15 |
Java에서 현재 stack trace를 얻는 방법 (0) | 2021.09.13 |