# Generics
- 실체화한 타입 파리미터
- 인라인 함수 호출에서 타입 인자로 쓰인 구체적인 타입을 실행 시점에 알 수 있다.
- 자바와 마찬가지로 코틀린 제네릭 타입 인자 정보는 런타임에 지워진다.(타입 소거)
- 이는 제네릭 클래스 인스턴스가 그 인스턴스를 생성할 떄 쓰인 타입 인자에 대한 정보를 유지하지 않는다는 뜻
- 컴파일러는 인라인 함수의 본문을 구현한 바이트코드를 그 함수가 호출되는 모든 지점에 삽입한다. 그래서 컴파일러는 실체화한 타입 인자를 사용해 인라인 함수를 호출하는 각 부분의 정확한 인자 타입을 알
수 있다.
- 선언 지점 변성
- 두 제네릭 타입이 있을 때 상위/하위 타입 관계에 따라 제네릭 타입의 관계가 어떻게 되는지 지정할 수 있다.
- 사용 지점 변성
- 재내락 타입 값 사이의 상위/하위 타입의 관계 지정을 제네릭 타입 값을 사용하는 위치에서 파라미터 타입에 대한 제약을 표시하는 방식으로 달성한다.
- 자바 와일드카드는 사용 지점 변성에 속하며, 코틀린 선언 지점 변성과 같은 역할을 한다.
---
- 널이 될 수 있는 타입
- 아무런 상한을 정하지 않은 타입은 결과적으로 `Any?`를 상한으로 정한 파라티터와 같다
```kotlin
class Processor<T> {
...
}
class Processor<T : Any> {
...
}
타입 파리미터 제약
<T extends Number> T sum(List<T> list)
클래스, 타입, 하위 타입
val s: String = "abc"
val t: String? = s
// String이 String?의 하위 타입이므로 이 대입은 합법적이다.
무공변성
공변성
List<A>
는 List<B>
의 하위 타입이다. 그런 클래스나 인터페이스를 공변적이라 말한다.out
을 넣어야한다.반공변성
스타 프로젝션
List<*>
라는 구문으로 표현할 수 있다.