더 이상 유형 삭제를 수행하지 않아도되도록 Java를 어떻게 개선 할 수 있습니까?


16

제네릭에 공식 자바 튜토리얼 형식의 삭제를 설명하고 왜이 컴파일러에 추가되었습니다 :

제네릭 형식이 인스턴스화되면 컴파일러는 형식 지우기라는 기술로 해당 형식을 변환합니다.이 기법은 클래스 또는 메서드 내에서 형식 매개 변수 및 형식 인수와 관련된 모든 정보를 제거하는 프로세스입니다. 유형 삭제를 사용하면 제네릭을 사용하는 Java 응용 프로그램이 제네릭 전에 작성된 Java 라이브러리 및 응용 프로그램과 바이너리 호환성을 유지할 수 있습니다.

이것은 아마도 실용적인 접근 방식이거나 아마도 가장 고통스러운 방법 일 것입니다. 그러나 이제 제네릭이 업계 전반에서 널리 지원되고 있으므로 유형 삭제가 필요하지 않도록하려면 어떻게해야합니까? 이전 버전과의 호환성을 깰 필요가 없는가, 아니면 가능하다면 실용적입니까?

위 인용문의 마지막 진술이 자기 참조가 되었습니까? 즉, "유형 삭제를 사용하면 제네릭을 사용하는 Java 애플리케이션이 유형 삭제를 수행하는 Java 버전으로 작성된 Java 라이브러리 및 애플리케이션과 바이너리 호환성을 유지할 수 있습니다."


1
태양 1.4는 EOL되었습니다. IBM은 여전히 ​​해당 플랫폼에서 1.4를 지원합니다.

@ ThorbjørnRavnAndersen : 그리고 적어도 아빠의 지하실에있는 플랫폼 에는 1.5 가 없습니다 .
Jörg W Mittag 2016 년

@ ThorbjørnRavnAndersen뿐만 아니라 훨씬 이전 버전의 JVM에 대한 확장 지원도 구입할 수 있습니다. 나는 그것이 꽤 비싸지 만 들었다.
maple_shaft

1
우리 중 누구도 수정 구슬을 가지고 있지 않으므로 답할 수 없습니다. "다음에있을 것인가 ..."라는 질문에서 "이후 Java 버전에서 Type Erasure를 수행하기 위해 수행해야 할 사항"으로 질문을
바꾸면 다시 열 수 있습니다.

@ JörgWMittag는 2012 년에 실제로 프로덕션에 사용되는 플랫폼일까요?

답변:


7

수명 종료는 Java Development Toolkit 및 Java Runtime Environment에 적용됩니다. 그리고 Oracle (Sun) 버전 만 해당됩니다. 그러나 타사에서 작성한 응용 프로그램에는 적용되지 않습니다. JVM에서 실행 된 코드를 절대로 중단하지 않기 때문에 Java가 유형 삭제를 중단 할 가능성은 거의 없습니다.

물론 C #은 형식 삭제를 수행하지 않고 이전 버전과 호환되는 방식으로 이후 버전의 제네릭을 도입했지만 기본적으로 모든 컬렉션 클래스를 복제하는 것을 의미했습니다. 내가 생각하는 것은 Java 디자이너가 원하지 않는 것이므로 처음부터 유형 지우기를 선택한 이유입니다. 값 유형이 없으면 유형이 지워지지 않은 제네릭의 이점은 그리 크지 않습니다.


6
OpenJDK 팀은 Restricted Generics를 다시 보면서 논의 했습니까? Java 9의 기간 동안 기술적으로 실현 가능할 경우 진지하게 살펴볼 가능성이 가장 높으며 Java 10의 기간으로 제공됩니다. 그러나 이것은 나의 진지한 진정이다.
Martijn Verburg

유형 삭제는 JVM이 아닌 컴파일러에 의해 수행됩니다. 통합 제네릭을 도입하려면 새로운 컴파일러와 새로운 JVM이 필요하지만 여전히 이전 코드로 작동합니다.
Gabe

@Gabe : 분명히 새 릴리스에 도입되었으므로 새로운 컴파일러와 새로운 JVM이있을 것입니다. 그러나 표준 라이브러리의 상당 부분을 복제해야합니다. 새로운 코드의 경우 일반 버전과 이전 버전과의 호환성을 위해 비 일반 버전이 필요하기 때문입니다. .NET은 버전 2.0에서 그것을 삭제했지만 Java는 지우지 않았습니다. .NET에는 값 유형 (struct)이 있으며이를위한 일류 지원은 유형 삭제를 금지합니다. Java는 그렇지 않으므로 통합 제네릭에 대한 압력이 훨씬 적습니다.
Jan Hudec

Jan : 제네릭을 수정한다고해서 모든 오래된 코드가 자동으로 깨지는 것은 아닙니다. 또한 List<int>아마도 현재보다 워크로드를 훨씬 더 효율적으로 만들 수있을 것이라고 덧붙였다 List<Integer>.
Gabe

@Gabe : 우리는 그것에 동의하지 않습니다. 방금 주요 단점을 지적하고 싶었습니다.
Jan Hudec
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.