- 具体的なデータ型に直接依存しない、抽象的かつ汎用的なコード記述を可能にするコンピュータプログラミング手法である。
- 例のように定義時は具体的なデータ型に依存しないようにしておいて、 利用時にデータ型を設定することで、汎用的なコード記述を可能にする
fun main(args: Array<String>) {
var objet = genericsExample<String>("JAVA")
var objet1 = genericsExample<Int>(10)
var object3 = genericsExample<Double>(10.00)
}
class genericsExample<T>(input:T) {
init {
println(input)
}
}
- 「」は型引数という機能であり、型引数とは「型を受け取るための仮引数」のことである
- 関数内(<>ブロック間)で複数のジェネリック型を定義でき、それぞれをコンマ(、)で区切る。下記のサンプルでは、NumberのサブタイプであるTと呼ばれる単一のジェネリック型が定義される。
数値の配列を作成する必要があることを示すために、arrayOf関数にNumberタイプが指定されている。
fun main(args: Array<String>) {
val nums = arrayOf<Number>(7, 42.7)
println("${combineToString(nums[0], nums[1])}")
}
// Single generic type called "T" defined in the function just before its name.
fun <T: Number> combineToString(num1: T, num2: T) = "$num1-$num2"
open classHoge() {} classFoo(): Hoge() {
valfoo = "foo" }
classGeneric<T: Hoge>(varobj: T) { fungetProp(): T {
returnobj }
}
valg1 = Generic<Foo>(Foo()) println(g1.getProp().foo) // 結果:foo
ネストされたクラス
class Outer {
private val bar: Int = 1
class Nested {
fun foo() = 2
}
}
val demo = Outer.Nested().foo() // == 2
内部クラス
class Outer {
private val bar: Int = 1
inner class Inner {
fun foo() = bar
}
}
val demo = Outer().Inner().foo() // == 1