フリーランス 技術調査ブログ

フリーランス/エンジニア Ruby Python Nodejs Vuejs React Dockerなどの調査技術調査の備忘録

kotlin覚えたメモ⑦(ジェネリクス)

ジェネリクス

ジェネリックプログラミング

  • 具体的なデータ型に直接依存しない、抽象的かつ汎用的なコード記述を可能にするコンピュータプログラミング手法である。
  • 例のように​定義時は具体的なデータ型に依存しないようにしておいて、 利用時にデータ型を設定することで、汎用的なコード記述を可能にする
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"
  • classも指定することができる
open ​​class​​Hoge​() {} class​​Foo​(): Hoge() {
​val​foo = ​"foo" }
class​​Generic​<​T: Hoge​>(​var​obj: T) { ​fun​​getProp​(): T {
​return​obj }
}
val​g1 = 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