🤔

JavaとTypeScriptでジェネリクスについて比較する

2024/12/14に公開

はじめに

この記事では、プログラミングの中でも便利だけどちょっと難しそうな「ジェネリクス(Generics)」について、JavaTypeScriptの違いを比較しながら解説してみます!

ジェネリクスって何?

ジェネリクスは簡単に言うと、型を柔軟に扱える仕組みのことです。
具体的には、「この処理はどんな型でも動くようにしたい!」とか「後から型を決めたい!」というときに使います。これによって、コードを再利用しやすくなり、間違った型を使うミスも防げます。

Javaのジェネリクス

1. いつから使えるの?

Javaにジェネリクスが登場したのはJava 5(2004年)です。結構昔ですね。

2. なんで導入されたの?

ジェネリクスが追加された背景には、主に以下の理由があります。

  • 型安全性の向上
    コレクションにいろんな型を混ぜてしまうと、後でエラーになることがよくありました。この問題を解消するためです。
  • コードのスッキリ化
    型キャスト(型を明示的に変換する処理)を減らして、もっと簡潔に書けるようにしたかったんですね。

3. 特徴的なポイント

  • 型消去(Type Erasure)
    ジェネリクスはコンパイル時だけ型をチェックし、実行時には型の情報がなくなります。
    つまり、ジェネリクスを使っていても、実行時にはObject型みたいな扱いになります。
  • 制約付き型パラメータ
    型に制約をつけて、「この型は特定のクラスやインターフェースを継承しているものだけ」という指定が可能です。

4. 実際のコード例

import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("Hello");
        // list.add(123); // コンパイルエラー
        String str = list.get(0); // キャスト不要!
        System.out.println(str);
    }
}

TypeScriptのジェネリクス

1. いつから使えるの?

TypeScriptでは、ジェネリクスは最初のバージョン(2012年)からサポートされています。

2. なんで導入されたの?

TypeScriptのジェネリクスには、以下の目的がありました。

  • JavaScriptの型ミスを防ぐ
    JavaScriptでは、型がないせいで「型ミス」が原因のバグが起きがち。これを防ぐために、型の安全性を確保する仕組みとして導入されました。
  • 柔軟性を損なわない
    JavaScriptの「自由さ」を活かしつつ、型を使える便利な仕組みを提供するのが狙いです。

3. 特徴的なポイント

  • 型推論
    TypeScriptは、ジェネリクスの型を自動で推論してくれるので、明示的に書かなくても大丈夫なことが多いです。
  • 型制約(Constraints)
    extendsを使って、型の範囲を指定できます。

4. 実際のコード例

function getItems<T>(items: T[]): T[] {
    return items;
}

const numbers = getItems([1, 2, 3]); // 型推論でTがnumberに
const words = getItems(["hello", "world"]); // 型推論でTがstringに
console.log(numbers, words);

JavaとTypeScriptのジェネリクスを比べてみる

特徴 Java TypeScript
型チェックのタイミング コンパイル時 コンパイル時(型情報はJavaScriptに反映されない)
型消去 コンパイル後に型情報は削除される JavaScriptに変換されるため、型は実行時には存在しない
型制約 extendsで制約を指定可能 extendsで制約を指定可能
推論 型を明示する必要が多い 型推論が可能
主な用途 コレクションや汎用クラス 関数や汎用クラス/インターフェース
実行環境 JVM上 ブラウザ/Node.js

まとめ

  • Javaのジェネリクスは、型安全性を高めてエラーを防ぐのに役立つツールで、コレクション操作が特に便利になります。ただし、型消去の仕組みに注意が必要です。
  • TypeScriptのジェネリクスは、型推論のおかげでより簡潔に書けるのが魅力です。JavaScriptの弱点である型ミスを防ぎつつ、柔軟なコーディングをサポートしてくれます。

Discussion