LoginSignup
0
0

More than 3 years have passed since last update.

Kotlin入門:ジェネリック型

Posted at

ジェネリック型

汎用的なクラス・メソッドに対して、特定の型を紐付けるための機能のこと。

入力例:

val data:Array = arrayOf(1,2,"3.14")

これに対しジェネリック型を使用すると

            //<要素型>
val data:Array<Int> = arrayOf(1,2,3)

こうなります。
これが特定の型を紐付けるということです。

ジェネリック型の定義

class Generic<E>(var value:E){
    fun getString():E{
        return this.value
    }
}
fun main() {
  val gene1 = Generic<String>("Hello")
    println(gene1.getString())
    println(gene1.getString() is String)
  val gene2 = Generic(123)
    println(gene2.getString())
    println(gene2.getString() is Int)
}

①で、GenericクラスにString型を割り当てて代入しています。
これでgene1E型はStringだと判定されるようになります。

②で、GenericクラスにInt型を割り当てて代入しています。
これでgene2E型はIntだと判定されるようになります。
また、<要素型>は省略することもできます。

実行結果は以下の通りです。

Hello
true
123
true

型引数の制約

渡す型を制限したいとき、<E:super>の形式で型引数を指定します。
これでE型はsuper、もしくはその派生クラスであるという意味になります。
入力例:

open class parent(){}
class child():parent(){
    val value = "Hello World"
}
//E:parentでE型はparentまたはその派生クラスでならなければならないという意味になります
class Generic<E:parent>(var value:E){
    fun getString():E{
        return this.value
    }
}
fun main() {
    val gene = Generic<child>(child())
    println(gene.getString().value)
}

ジェネリック関数

引数や戻り値型を、関数を呼び出す際に決められる関数のこと。

構文:

fun <E> name(args:type):rtype{}

E:型引数
name:関数名
args:引数
type:引数の型
rtype:戻り値の型
関数名の直前に<>で型引数を宣言します。

fun main() {
    println(sayHello("Hello World"))
    println(sayHello<String>("Hello World"))
}
fun <E> sayHello(greeting:E):E = greeting

引数の型から、暗黙的に型引数の型を判定するため、特別な構文は不要です。
関数名の直後に<>の形式で型を明示することもできます。
実行結果は以下の通りです。

Hello World
Hello World
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0