ジェネリック型
汎用的なクラス・メソッドに対して、特定の型を紐付けるための機能のこと。
入力例:
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
型を割り当てて代入しています。
これでgene1
のE
型はString
だと判定されるようになります。
②で、Generic
クラスにInt
型を割り当てて代入しています。
これでgene2
のE
型は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