🤔
JavaとTypeScriptでジェネリクスについて比較する
はじめに
この記事では、プログラミングの中でも便利だけどちょっと難しそうな「ジェネリクス(Generics)」について、JavaとTypeScriptの違いを比較しながら解説してみます!
ジェネリクスって何?
ジェネリクスは簡単に言うと、型を柔軟に扱える仕組みのことです。
具体的には、「この処理はどんな型でも動くようにしたい!」とか「後から型を決めたい!」というときに使います。これによって、コードを再利用しやすくなり、間違った型を使うミスも防げます。
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