Java
 Computer >> コンピューター >  >> プログラミング >> Java

Javaの型消去(Type Erasure)とは?仕組みとサンプルコードをわかりやすく解説

Javaは、ジェネリックプログラミングをサポートしつつ、より厳密な型チェックを実現するために、「型消去(Type Erasure)」という仕組みを採用しています。

型消去とは、コンパイル時にジェネリック型の型引数に関する情報を取り除き、バイトコードには通常のクラス・メソッド・インターフェースのみが含まれるようにする仕組みです。具体的には、以下のような処理が行われます。

  • ジェネリック型のすべての型パラメータは、境界型(境界が指定されていない場合はObject型)に置き換えられます。これにより、バイトコードにはクラス、メソッド、インターフェースのみが含まれることになります。

  • 型の整合性を保つために、必要に応じて型キャストが挿入されます。

  • ジェネリック型を継承したクラスにおいて多態性(ポリモーフィズム)を維持するため、ブリッジメソッドが自動的に生成されます。

サンプルコード

import java.io.PrintStream;
import java.util.*;

public class Demo {
    public Demo() {
    }

    public static void main(String args[]) {
        List my_list = new ArrayList();
        my_list.add("Hi there");
        String my_str;
        for (Iterator iter = my_list.iterator(); iter.hasNext();
             System.out.println(my_str))
            my_str = (String) iter.next();
    }
}

実行結果

Hi there

このコードでは、Demoという名前のクラスが定義されており、処理内容が空のコンストラクタを持っています。mainメソッド内では、まず新しいArrayListが生成され、addメソッドを使って文字列要素が追加されます。続いてIteratorを取得し、hasNextメソッドで次の要素が存在するかどうかを確認しながら要素を順番に取り出します。取り出した要素はString型にキャストされ、画面に出力されます。

補足:生の型(Raw Type)について

上記の例では、Listを型パラメータなしで宣言しています。これは「生の型(Raw Type)」と呼ばれる書き方で、Java 5でジェネリクスが導入される以前のコードとの互換性を保つために残されているものです。現代のJavaでは、List<String> のように型パラメータを明示的に指定することが推奨されています。型パラメータを指定すれば、明示的なキャストが不要になり、コンパイル時により厳密な型チェックを受けられるというメリットがあります。

  1. JavaのStringIndexOutOfBoundsExceptionとは?発生原因と対処法をわかりやすく解説

    StringIndexOutOfBoundsExceptionとはJavaにおいて、文字列(String)は一連の文字を格納するために使用され、オブジェクトとして扱われます。文字列は、java.langパッケージに含まれるStringクラスによって表現されます。文字列の作成方法は主に2つあります。1つは他のオブジェクトと同様にnewキーワードを使用する方法、もう1つはプリミティブ型のようにリテラルを直接代入する方法です。String stringObject = new String(Hello how are you); String stringLiteral = Welcome to T

  2. 【Java】文字列がboolean型かどうかを判定する方法を解説

    はじめに:Booleanクラスの変換メソッド Javaのjava.langパッケージに含まれるBooleanクラスには、文字列をboolean値へ変換するためのメソッドとして、parseBoolean() と valueOf() の2種類が提供されています。 parseBoolean(String s) − 引数として文字列を受け取り、プリミティブ型のboolean値を返します。指定された文字列が「true」(大文字・小文字は問わない)であれば true を返し、null や「false」、それ以外の任意の値であれば false を返します。 valueOf(String s) − 引数とし