총칭형으로도 불리며 형을 매개 변수로 사용할 수 있다. 일반적으로 <>의 섹션은 와 같은 Generics입니다. Box 클래스의 스토리지 유형 변수의 예를 살펴보겠습니다.이때 Box 클래스는 다음과 같습니다.
class Box<T>(t: T){var value = t
}
이것은 실례를 생성할 때 저장할 유형을 정의할 수 있는 기술이다.예를 들어 Int형 상자로 사용하려면 다음과 같은 내용을 실현할 수 있다.
val box: Box<Int>= Box<Int>(1)
또한, 스트링형 상자로 만들려면 다음과 같이 설치하십시오.
val box: Box<String>= Box<String>("test")
이 Generics의 변수명은 E와 K 등 많은 곳에서 볼 수 있지만 Generics의 뜻은 변수명으로 바뀌지 않을 것이라고 생각합니다.그러나 일반적으로 다음과 같이 구분된다.
T...Type(유형. 유형을 매개변수로 사용할 경우)
E...Element(요소, List 등에 사용)
K...Key(열쇠, 맵 등에서 사용)
V...Value(값.Map 등에서 사용)
R...Result(반환값)
Generics가 필요한 이유 (Generics 없이 이렇게 됨)
어떤 유형이든 저장할 수 있다는 뜻이라면 앤(Java의 경우 Object)은 문제없다. 다만 이 경우 무엇이든 저장할 수 있기 때문에 예측할 수 없는 데이터 유형을 포함할 수 있다.이것은 실행할 때classCastException이 판명하는 원인이 될 가능성이 높으며, 이 문제를 방지하기 위해 본질적으로 존재하지 않는 코드를 기술하는 경우도 증가할 수 있다.
classBox(a: Any){var value = a
}val box =Box(1111)val box2 =Box("test")
arrayListOf<Box>(box,box2)//数値と思い込むとあとでclassCastExceptionになる
이것은 형 안전이라고 할 수 없다.따라서 Generics를 사용하여 Box가 Int에만 들어갈 수 있음을 명시적으로 선언하는 것을 목표로 합니다.
class Box<T>(t: T){var value = t
}val box =Box(1111)val box2 =Box("test")
arrayListOf<Box<Int>>(box,box2)//box2がType miss matchでコンパイルエラー
이 기능의 사용처
이 기능을 이용하면 추상화의 실현을 실현할 수 있다.우리 몇 가지 사용 예를 봅시다.
Collection 등 컨테이너
데이터의 조작 방법을 제공했지만 데이터 내용 자체가 통일되면 된다.예를 들어 Kotlin의 Collection 유형 정의는 다음과 같습니다.
publicinterface List<out E>: Collection<E>
지정한 분류의 되돌아오는 값을 지정합니다
DDD의 상하문에서 Application층이 응용 프로그램 논리만 기록하고 무상태를 원한다면 Stream이subscribe에 의해 디스포즈되었는지 여부가 있습니다.따라서 이러한 abstract class를 준비하여 반환 값을 제한합니다.