ジェネリック関数とクラス
型をパラメーター化します
「ジェネリック関数とクラス」はCoddyKit上の無料Kotlin Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはKotlin Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Kotlin Academyコースには全4レッスンが含まれています。
ジェネリクスとは
ジェネリクスを使うと、完全な型安全性を保ちながら、さまざまな型で動作するコードを書けます。具体的な型を固定する代わりに、プレースホルダーとして型パラメーター(多くの場合T)を使います。
ジェネリック関数
ジェネリック関数では、関数名の前に山かっこで型パラメーターを宣言します。ここでのTには任意の型を指定できます。
fun <T> identity(value: T): T {
return value
}
fun main() {
println(identity(42))
println(identity("hello"))
}型推論
型を明示的に指定することはほとんどありません。コンパイラーが引数からTを推論するためです。必要であれば、identity<Int>(42)のように記述することもできます。
fun <T> firstOf(a: T, b: T): T = a
fun main() {
val x = firstOf(10, 20)
val y = firstOf("a", "b")
println("$x $y")
}複数の型パラメーター
関数には複数の型パラメーターを指定できます。互いに関係のない2つの型を扱う場合などに便利です。
fun <A, B> makePair(first: A, second: B): Pair<A, B> {
return Pair(first, second)
}
fun main() {
val p = makePair("age", 30)
println(p)
}ジェネリッククラス
クラスもジェネリックにできます。型パラメーターはクラス名の後に宣言し、プロパティや関数で使用できます。
class Box<T>(val value: T) {
fun get(): T = value
}
fun main() {
val intBox = Box(123)
val strBox = Box("Kotlin")
println(intBox.get())
println(strBox.get())
}振る舞いを持つジェネリッククラス
ジェネリッククラスは、シンプルなコンテナのように可変状態を保持し、型パラメーターに対する操作を実行できます。
class Stack<T> {
private val items = mutableListOf<T>()
fun push(item: T) { items.add(item) }
fun pop(): T = items.removeAt(items.size - 1)
fun isEmpty() = items.isEmpty()
}
fun main() {
val stack = Stack<Int>()
stack.push(1)
stack.push(2)
println(stack.pop())
}ジェネリックインターフェース
インターフェースでも型パラメーターを宣言できるため、実装側で具体的な型を選択できます。
interface Container<T> {
fun item(): T
}
class StringContainer : Container<String> {
override fun item(): String = "fixed"
}
fun main() {
println(StringContainer().item())
}Any を使うだけではいけない理由
値をAnyとして保存することもできますが、型情報が失われ、キャストが必要になります。ジェネリクスなら正確な型が保持されるため、コンパイラーが間違いを検出でき、キャストも必要ありません。
fun main() {
val box: Box<String> = Box("text")
val s: String = box.get()
println(s.uppercase())
}
class Box<T>(val value: T) { fun get(): T = value }ジェネリック拡張関数
拡張関数もジェネリックにできるため、あらゆる型で再利用できるユーティリティを作成できます。
fun <T> T.printAndReturn(): T {
println("Value: $this")
return this
}
fun main() {
val x = 5.printAndReturn()
"hi".printAndReturn()
println(x)
}命名規則
慣例として、型パラメーターには大文字1文字を使います。Tは汎用的な型、Eは要素、KとVはマップのキーと値、Rは結果を表します。
いたるところにあるジェネリクス
Kotlinの標準ライブラリはジェネリクスを基盤としています。たとえばList<T>、Map<K, V>、Pair<A, B>などです。ジェネリクスを理解すると、これらの型を自信を持って読み、使えるようになります。
確認問題
Anyを使う場合と比べたジェネリクスの主なメリットは何ですか?
まとめ
ジェネリクスでは、Tのような型パラメーターを使って、再利用可能で型安全な関数、クラス、インターフェースを作成します。コンパイラーが型を推論して安全性を保証するため、キャストを避けられます。次は、inとoutによる宣言側変性を使って、ジェネリック型同士の関係を制御します。
AI チューターと学ぶ Kotlin — 無料
ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。
- コース
- 51
- レッスン
- 203
よくある質問
「ジェネリック関数とクラス」レッスンは無料ですか?
はい。「ジェネリック関数とクラス」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Kotlin Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Kotlin Academyコースには全4レッスンが含まれています。
「ジェネリック関数とクラス」で何を学びますか?
型をパラメーター化します ブラウザで直接実行するハンズオンコードでKotlin Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Kotlin Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのKotlin Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「ジェネリック関数とクラス」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このKotlin Academyレッスンでコードを書いて実行できますか?
はい。すべてのKotlin Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。