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의 실제 타입을 결정하는 데 하향식 추론이 사용된다는 점을 주목해야 합니다. 이런 종류의 타입 매개변수 생성을 위해, 생성되는 타입 매개변수는 두 가지 요구사항을 충족해야 해요:
- 제네릭이어야 한다.
- 생성자(constructor)를 가지도록 명시적으로 제약(constrained)되어야 한다.
여기서 첫 번째 요구사항은 make가 @:generic 메타데이터를 가짐으로써 충족되고, 두 번째는 T가 Constructible로 제약됨으로써 충족돼요. 이 제약은 String과 haxe.Template 모두에 성립하는데, 둘 다 단일 String 인자를 받는 생성자를 가지기 때문이에요. 확실히 관련 Java C++ 생성 코드가 생성됩니다. 각 대상에서 이 메서드에 대해 여러 구현이 만들어져, new T("foo")가 각각의 실제 타입으로 치환됩니다.
본문
제네릭 타입 매개변수
일반 타입 매개변수는 new T() 형태로 생성될 수 없어요. 컴파일러가 단일 함수만 만들기 때문이에요. 하지만 제네릭 타입 매개변수는 각 타입 조합마다 별도 함수를 만들기 때문에 생성이 가능합니다.
요구사항
생성되는 타입 매개변수는 두 조건을 만족해야 해요: (1) 제네릭이어야 하고, (2) 생성자를 가지도록 제약되어야 합니다. 예제에서 @:generic과 T:Constructible 제약이 그 조건을 충족합니다.
실제 타입 결정
make()가 호출될 때 하향식 추론으로 T의 실제 타입이 결정되고, 생성된 각 함수에서 new T("foo")가 실제 타입으로 치환됩니다.