IT

C # 대 Java 제네릭

lottoking 2020. 7. 22. 07:46
반응형

C # 대 Java 제네릭 [중복]


Generics의 Java 구현이 C # 구현만큼 좋지 않다고 들었습니다. 구문이 비슷해 보이면 Java 구현에 대해 비표준적인 것이 무엇입니까, 아니면 종교적인 관점입니까?


streloksi의 링크 는 차이점을 분석하는 데 큰 도움이됩니다. 그러나 빠르고 더러운 요약은 ...

구문과 사용법에서. 구문은 언어간에 거의 동일합니다. 여기 저기 몇 가지 단점이 있습니다 (주로 제약 조건). 그러나 기본적으로 하나를 읽을 수 있습니다.

그러나 가장 큰 차이점은 구현에 있습니다.

Java는 삭제 유형 개념을 사용하여 제네릭을 구현합니다. 간단히 말해 기본 준비 클래스는 일반적으로 기본 준비된 클래스입니다. 그들은 Object로 캐스팅하고 캐스팅합니다. Java 제네릭은 실제로 실행할 수 있습니다.

반면에 C #은 CLR 덕분에 바이트 코드에 따라 제네릭을 구현합니다. CLR은 2.0에서 제네릭을 지원하기 위해 몇 가지 주요 변경 사항을 적용했습니다. 장점은 성능 개선, 심층적 인 안전하고 반영입니다.

다시있는 링크 는 훨씬 더 깊이있는 링크를 가지고 있습니다.


차이점은 Microsoft와 Sun의 디자인 결정에 달려 있습니다.

Java의 제네릭 은 컴파일러에서 유형을 삭제 하여 구현 합니다. 즉, 수행되고 유형 정보가 제거됩니다. 이 접근 방식은 레거시 코드를 제네릭을 사용하여 새 코드와 호환 가능하게 유지하기 위해 수행했습니다.

Java 학습서, 제네릭 : Type Erasure :

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

그러나 C # (. NET) 제네릭의 을 사용하면 컴파일러에서 형식을 지우지 않으며 런타임 동안 형식 검사가 수행됩니다. 이 유형의 정보가있는 코드에 보존 이점이 있습니다.

Wikipedia에서 :

이 디자인 선택은 제네릭 형식을 보존하여 리플렉션을 허용하고 삭제의 일부 제한 (예 : 제네릭 배열을 만들 수 없음)을 사용하기 위해 사용됩니다. 이는 또한 실행 캐스트 및 일반적으로 값 모든 변환으로 인한 성능이 없음을 의미합니다.

".NET 제네릭이 Java 제네릭보다 낫다"라고 말하는 대신 제네릭을 구현하는 방식의 차이를 조사해야합니다. Java에서는 높은 수준의 유지가 우선 순위가 높은 것이 보이며 .NET (버전 2.0에서 도입 된 경우)에서는 제네릭 사용의 전체 이점을 실현하는 것이 높았습니다.


또한 볼 너무 재미있을 수 앤더스 헤 즐스 버그와 대화를. Anders Hejlsberg가 몇 가지 추가 사항을 추가 할 사항을 요약하면 다음과 같습니다. Java 제네릭은 기존 JVM과의 사용을 위해 만들어 졌거나 C #에서 볼 수있는 이상한 점과 구현이 거의 없습니다.

  • 타입 소거는 모든 일반 표현 변수화 된 값을로 구현한다 Object. 컴파일러는 Object보다 구체적인 유형 제공 자동 캐스트를 제공하지만 , 유형 캐스트 ​​및 모든 기능에 성능에 미치는 영향을 제거합니다 (예 : Object특정 유형으로 캐스트 MyClass또는 int박스형 함 Integer). 이는 C # /에 더욱 심각합니다. 사용자 정의 값 유형으로 인해 유형 삭제 접근 방식을 따르는 경우 NET). Anders가 말했듯이 : "당신은 실행 효율성을 얻지 못합니다"(C #에서 제네릭 제네릭을 가능하게 함)

  • 유형 삭제는 실행에 액세스 할 수있는 수단 타임에 정보를 사용할 수 있습니다. 예전 뭔가 List<Integer>단지가 실행 List에 제네릭 형식 매개 변수를 복구 할 방법으로. 이로 인해 Java 제네릭에 대한 리플렉션 또는 동적 코드 생성 시나리오를 구축하기 어렵습니다. 더 최근의 SO 답변 은 익명 클래스를 통해 그 주변에 방법을 보여줍니다. 그러나 트릭 생성이 운영되는 하나의 컬렉션 인스턴스에서 실행되는 요소를 가져 와서 다른 컬렉션 인스턴스에 넣는 리플렉션을 통해 코드를 생성하는 것과 같이 실행하는 동안 실패 할 수 있습니다. 리플렉션은 상황 에서 List<Double>대립 을 잡는 데 도움이되지 않습니다 List<Integer>.

그러나 Jonathan Pryor의 블로그 게시물 에 대한 답변은 +1입니다 .

참고 URL : https://stackoverflow.com/questions/355060/c-sharp-vs-java-generics

반응형