1. 概要

このクイックチュートリアルでは、Kotlinの型エイリアスとそのユースケースについて理解します。 その過程で、この機能がバイトコードレベルでどのように現れるかについても見ていきます。

2. タイプエイリアス

Kotlinでは、タイプエイリアスを使用して既存のタイプの代替名を宣言することができます。 基本的な構文を見てみましょう。

typealias <NewName> = <ExistingType>

これらのエイリアスは、一部のシナリオで役立ちます。 たとえば、これらを使用して、他の一般的なタイプにより多くのコンテキストを付加できます。

typealias CreditCard = String
fun linkCard(card: CreditCard) {
    // omitted
}

上に示したように、 String の型エイリアスを定義することで、より多くの情報とコンテキストを呼び出し元に伝えています。

タイプエイリアスの使用は簡単です。

val cc: CreditCard = "1234****"
linkCard(cc)

ここでは、StringリテラルをCreditCard型の変数に割り当てています。 さらに、CreditCardインスタンスに対してString操作を実行することもできます。

val other = cc.toUpperCase()

それに加えて、CreditCardインスタンスが予想される場所ならどこでもStringを使用できます。

linkCard("1234****")

linkCard関数はCreditCardインスタンスを想定していますが、Stringインスタンスを渡します。

タイプエイリアスには他のユースケースもあります。 たとえば、これらを使用して、関数リテラルのより意味のある名前を持つ新しい型を作成できます。

class HttpRequest
class HttpResponse
typealias RequestHandler = (HttpRequest) -> HttpResponse

ここでは、Webコントローラーを HttpRequest-> HttpResponse の関数として定義する代わりに、RequestHandlerタイプを使用します。

これは、Java 8のより身近な例です—ジェネリック型エイリアスの宣言:

typealias Predicate<T> = (T) -> Boolean

さらに、型エイリアスを使用して、いくつかの長いデータ型名を短縮できます

typealias Completed = CompletableFuture<Map<String, Pair<String, Int>>>

3. バイトコード表現

タイプエイリアスは、ソースコードの単なるアーティファクトです。 したがって、実行時に新しいタイプを導入することはありません 。 たとえば、 CreditCard インスタンスを使用しているすべての場所で、KotlinコンパイラはそれをStringに変換します。

この変換が行われることを確認するために、生成されたバイトコードを確認します。

まず、kotlincを介してKotlinコードをコンパイルしましょう。

$ kotlinc TypeAlias.kt

次に、javapを介して生成されたバイトコードを確認できます。

$ javap -c -p com.baeldung.alias.TypeAliasKt
Compiled from "TypeAlias.kt"
public final class com.baeldung.alias.TypeAliasKt {
  public static final void linkCard(java.lang.String);
  // truncated
}

ご覧のとおり、 linkCard メソッドは、宣言されたタイプエイリアスの代わりにStringを受け入れます。 したがって、前述のように、 Kotlinコンパイラは、コンパイル時に型エイリアスを消去し、実行時に基になる型を使用します

4. 結論

この短いチュートリアルでは、Kotlinでタイプエイリアスをいつどのように使用するかを説明しました。 次に、この機能のバイトコード表現を確認しました。

いつものように、すべての例はGitHubから入手できます。