3.3.1 제네릭 타입 매개변수의 생성

3.3.1 제네릭 타입 매개변수의 생성

정의: 제네릭 타입 매개변수(Generic Type Parameter) — 타입 매개변수가 그것을 포함하는 클래스나 메서드가 제네릭일 때, 그 타입 매개변수를 제네릭이라고 합니다.

일반 타입 매개변수는 생성할 수 없어요. 예를 들어 new T()는 컴파일러 오류로 등록됩니다. 그 이유는 Haxe가 단일 함수만 생성하고 그 경우에 그 구성이 의미가 없기 때문이에요. 타입 매개변수가 제네릭이면 상황이 다릅니다. 컴파일러가 각 타입 매개변수 조합에 대해 별개의 함수를 생성한다는 것을 알고 있으므로, new T()T를 실제 타입으로 대체하는 것이 가능해요.

import haxe.Constraints;

class Main {
  static public function main() {
    var s:String = make();
    var t:haxe.Template = make();
  }

  @:generic
  static function make<T:Constructible<String>->Void>():T {
    return new T("foo");
  }
}

여기서 T의 실제 타입을 결정하는 데 하향식 추론이 사용된다는 점을 주목해야 합니다. 이런 종류의 타입 매개변수 생성을 위해, 생성되는 타입 매개변수는 두 가지 요구사항을 충족해야 해요:

여기서 첫 번째 요구사항은 make@:generic 메타데이터를 가짐으로써 충족되고, 두 번째는 TConstructible로 제약됨으로써 충족돼요. 이 제약은 Stringhaxe.Template 모두에 성립하는데, 둘 다 단일 String 인자를 받는 생성자를 가지기 때문이에요. 확실히 관련 Java C++ 생성 코드가 생성됩니다. 각 대상에서 이 메서드에 대해 여러 구현이 만들어져, new T("foo")가 각각의 실제 타입으로 치환됩니다.

출처: Construction of generic type parameters

본문

제네릭 타입 매개변수

일반 타입 매개변수는 new T() 형태로 생성될 수 없어요. 컴파일러가 단일 함수만 만들기 때문이에요. 하지만 제네릭 타입 매개변수는 각 타입 조합마다 별도 함수를 만들기 때문에 생성이 가능합니다.

요구사항

생성되는 타입 매개변수는 두 조건을 만족해야 해요: (1) 제네릭이어야 하고, (2) 생성자를 가지도록 제약되어야 합니다. 예제에서 @:genericT:Constructible 제약이 그 조건을 충족합니다.

실제 타입 결정

make()가 호출될 때 하향식 추론으로 T의 실제 타입이 결정되고, 생성된 각 함수에서 new T("foo")가 실제 타입으로 치환됩니다.

더 알아보기