문제

마을 바보가 될 위험을 무릅쓰고 제네릭이 제네릭이라고 불리는 이유를 누군가 나에게 설명해 줄 수 있습니까?나는 그 사용법과 이점을 이해하지만, 만약 일반의 정의 "일반"이고 일반 컬렉션은 유형이 안전합니다. 그렇다면 이것이 잘못된 이름이 아닌 이유는 무엇입니까?

예를 들어 ArrayList는 객체인 모든 것을 담을 수 있습니다.

ArrayList myObjects = new ArrayList();
myObjects.Add("one");
myObjects.Add(1);

문자열 유형의 일반 컬렉션은 문자열만 보유할 수 있습니다.

var myStrings = new List<string>();
myStrings.Add("one");
myStrings.Add("1");

왜 "일반"이라고 불리는지 명확하지 않습니다.대답이 "... 클래스 또는 메소드가 클라이언트 코드에 의해 선언되고 인스턴스화 될 때까지 하나 이상의 유형의 사양을 연기하는 클래스 및 메소드를 설계 할 수 있습니다." ~에서 여기, 그렇다면 그게 말이 된다고 생각합니다.아마도 나는 Java에 제네릭이 도입된 후에야 프로그래밍을 시작했기 때문에 정신적인 착오를 겪고 있는 것 같습니다. 그래서 그 이전의 시간을 기억하지 못합니다.하지만 아직...

도움을 주시면 감사하겠습니다.

도움이 되었습니까?

해결책

"일반"은 구현에 대해 이야기합니다.사용하려는 각 유형에 대해 특정 구현을 작성하는 대신 모든 유형에서 작동하는 단일 "일반" 목록 구현을 작성합니다.

다른 팁

이런 질문에 대한 정답은 거의 항상 '대부분 역사적 이유'라고 생각합니다.제네릭은 "구성표", "클래스", "유형군", "일반", "유형 함수", "정적", "그리스 유형" 등 수많은 다른 이름으로 불릴 수도 있습니다.오래 전에 누군가 "일반"이라는 단어를 사용하기로 결정했지만 그 단어는 그대로 사용되었습니다.

Java 의미에서 "일반"은 적어도 1970년대 중반으로 거슬러 올라갑니다.미국.국방부는 새로운 프로그래밍 언어(ADA가 됨)에 대한 요구 사항 문서를 다듬고 있었습니다.초기 초안("나무꾼", 1975년 8월)은 다음과 같이 말합니다.

각 요소 유형에 대한 정의를 반복하지 않고 스택 및 큐와 같은 일반 프로시저 및 데이터 구조의 사양을 허용하려면 확장 가능한 언어에서 컴파일 시간 매개변수가 필요합니다.

이것은 문서에서 "generic"이 사용된 유일한 것입니다.그것이 어떻게 의도되었는지는 나에게 명확하지 않습니다.그러나 1977년 7월("양철공") 제네릭에 대한 전체 단락이 있었고 그 용어는 분명히 특정한 것을 의미하게 되었습니다.

12D.일반적인 정의

각 호출에서 변환 중에 인스턴스화되는 매개변수를 사용하여 함수, 프로시저 및 유형을 정의할 수 있어야 합니다.이러한 매개변수는 정의된 식별자(변수, 함수 또는 유형에 대한 식별자 포함), 표현식 또는 명령문일 수 있습니다.다른 모든 매개변수와 마찬가지로 이러한 매개변수는 호출 컨텍스트에서 평가됩니다.

1978년 6월까지("강철 남자") 전문 용어가 확립되었습니다.문서의 다른 섹션에서는 "일반"이라는 용어가 다른 용도로 사용되어 이 기능을 명확하게 언급했습니다.완성된 언어에서는 generic 예약어였습니다.

이 문서의 작성자는 사이트에 나열되어 있으며 아마도 대부분이 여전히 남아 있을 것입니다.그들에게 전화를 걸어 기억나는 것이 무엇인지 물어보는 것도 좋을 것입니다.


내가 학계에서 발견한 "generic"의 그럴듯하게 관련된 최초의 사용은 Robin Milner의 것이었습니다. "프로그래밍의 유형 다형성 이론" (1978) (그리고 그는 "일반적인"이 무엇을 의미하는지 설명해야 한다고 느꼈기 때문에 당시 학계에서는 일반적으로 사용할 수 없었습니다):

그래서 이것은 일반적인 유형의 지도, 즉, 다음과 같은 경우가 발생합니다. 지도 이 선언 범위 내에서는 이 유형의 대체 인스턴스를 할당해야 합니다.

"일반 유형 변수"는 CS 전문 용어가 되었습니다.

bool Equals(int x, int y)

위의 방법은 정수만 비교할 수 있으므로 다음과 같다고 말할 수 있습니다. 전문화된 정수를 비교하기 위해.

bool Equals<T>(T x, T y);

위의 방법은 모든 유형의 값을 비교할 수 있으므로 그렇지 않다고 말할 수 있습니다. 전문화된 특정 유형에 대해 - 그것은 일반적인.

나는 언어의 의미(자바가 아닌 영어)에 들어가고 싶지 않으며 동어반복으로 대답할 위험이 있습니다.당신이 말했듯이 일반적인 의미로 사용될 수 있고 특정 유형이 없으며 일반적으로 사용될 수 있기 때문에 제네릭 메서드를 제네릭이라고 합니다.

좋아요, 이건 좀 가볍게 생각하세요. 왜냐면 저는 완전히 추측하고 있지만 이것이 "생성 유형"의 서투른 표현인지 궁금합니다.

개념적으로 List를 List< String >으로 특수화하면 새로운 유형이 생성됩니다.적어도 C++ 템플릿과 C# 제네릭에서는 작동하는 방식입니다.

Java에서는 유형 삭제를 사용하여 컴파일러에 의해 매개변수화가 삭제되므로 실제로는 그렇지 않다 새로운 특수 유형을 생성하면 누가 알겠습니까?

Java가 생성 유형의 일반화된 버전을 구현한다고 말할 수 있을 것 같습니다. :)


편집 중:

여기에 또 다른 관점이 있습니다 ...

List< String > 유형은 "일반" 유형을 참조할 때 말하는 내용이 아닙니다.내 생각에 이 용어는 실제로 List< T > 유형을 가리키는 것으로 생각됩니다. 이는 해당 유형이 일반적인 형태로 존재하는 방식입니다.List< String >은 일반 List< T >의 특수화입니다.

"유형 매개변수"라고 부르면 사람들은 이를 유형 유형의 매개변수와 혼동할 것입니다.

또한 ArrayList는 "일반"이 아닙니다.객체 유형에서만 작동합니다.무언가를 요청하면 객체 참조를 제공합니다.그것은 매우 구체적인 행동입니다.

객체를 취하는 클래스는 일반적인 것이 아니며, 매우 구체적으로 유형 이는 그 자체로 일반적인 유형입니다.반면에 일반 클래스는 특정 유형과 함께 사용할 수 있습니다.

동일한 방식으로 (지정한 제약 조건 내에서) 모든 유형에서 작동할 수 있는 "일반" 코드를 생성하기 때문입니다.

여러분에게 친숙한 좋은 예는 Add 연산자가 거의 모든 언어에 사용된다는 것입니다.부호 있는지, 없는지, 비트 수 등에 관계없이 정수, 부동 소수점, 복식, 십진수, 이진수, 16진수를 "추가"할 수 있습니다.

저는 "원어민" 영어 사용자가 아니므로 틀릴 수도 있지만 "Generics"의 요점은 Define Generics 유형이라는 것입니다. 그렇지 않습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top