# Generics

- 실체화한 타입 파리미터
    - 인라인 함수 호출에서 타입 인자로 쓰인 구체적인 타입을 실행 시점에 알 수 있다.
        - 자바와 마찬가지로 코틀린 제네릭 타입 인자 정보는 런타임에 지워진다.(타입 소거)
            - 이는 제네릭 클래스 인스턴스가 그 인스턴스를 생성할 떄 쓰인 타입 인자에 대한 정보를 유지하지 않는다는 뜻
        - 컴파일러는 인라인 함수의 본문을 구현한 바이트코드를 그 함수가 호출되는 모든 지점에 삽입한다. 그래서 컴파일러는 실체화한 타입 인자를 사용해 인라인 함수를 호출하는 각 부분의 정확한 인자 타입을 알
          수 있다.
- 선언 지점 변성
    - 두 제네릭 타입이 있을 때 상위/하위 타입 관계에 따라 제네릭 타입의 관계가 어떻게 되는지 지정할 수 있다.
- 사용 지점 변성
    - 재내락 타입 값 사이의 상위/하위 타입의 관계 지정을 제네릭 타입 값을 사용하는 위치에서 파라미터 타입에 대한 제약을 표시하는 방식으로 달성한다.
    - 자바 와일드카드는 사용 지점 변성에 속하며, 코틀린 선언 지점 변성과 같은 역할을 한다.

---

- 널이 될 수 있는 타입
    - 아무런 상한을 정하지 않은 타입은 결과적으로 `Any?`를 상한으로 정한 파라티터와 같다

```kotlin
  class Processor<T> {
    ...
}
  class Processor<T : Any> {
    ...
}
val s: String = "abc"
val t: String? = s

// String이 String?의 하위 타입이므로 이 대입은 합법적이다.