- 2011年12月4日 12:39 PM
- Java
Java の Generics の実装方式の型消去についてちょっと調べました。
そもそも ジェネリックプログラミングというのは、Java だけにあるものではなく色んな言語に同様の機能があるようです。
ジェネリックプログラミング wikipedia
Java の場合、言語仕様的に、どうやって Generics を実装しているかというと「型消去(type erasure)」によって行われている。
型消去とは、「コンパイル後のバイトコードに型情報を残さない」ということ。
具体的なサンプルコードで見てみる。
public void method15() {
List<String> list = new ArrayList<String>();
list.add("string");
String str = list.get(0);
}
public void method14() {
List list = new ArrayList();
list.add("string");
String str = (String) list.get(0);
}
これを、jad したものが以下。
public void method15();
0 new java.util.ArrayList [15]
3 dup
4 invokespecial java.util.ArrayList() [17]
7 astore_1 [list]
8 aload_1 [list]
9 ldc <String "string"> [18]
11 invokeinterface java.util.List.add(java.lang.Object) : boolean [20] [nargs: 2]
16 pop
17 aload_1 [list]
18 iconst_0
19 invokeinterface java.util.List.get(int) : java.lang.Object [26] [nargs: 2]
24 checkcast java.lang.String [30]
27 astore_2 [str]
28 return
public void method14();
0 new java.util.ArrayList [15]
3 dup
4 invokespecial java.util.ArrayList() [17]
7 astore_1 [list]
8 aload_1 [list]
9 ldc <String "string"> [18]
11 invokeinterface java.util.List.add(java.lang.Object) : boolean [20] [nargs: 2]
16 pop
17 aload_1 [list]
18 iconst_0
19 invokeinterface java.util.List.get(int) : java.lang.Object [26] [nargs: 2]
24 checkcast java.lang.String [30]
27 astore_2 [str]
28 return
確かに、コンパイルされると型情報が消去されて、Java 1.4 時代のものと同じになっている。
なぜ、Java では型消去という実装方式を採用したか?
C++ の場合、同様の機能にテンプレートというものがあるらしく、そちらはコンパイル後も型情報をインライン展開して残すらしいです。
で、Java の場合、なぜ型消去という実装方式を採用したかというと、「後方互換性」のためらしい。
先の例で見たように、コンパイル後のコードが全く同じになるので、1.4 以前で書かれたコードと 1.5 以上で書かれてコードがコードが混在していても実行できる、ということ。
なるほど、よく出来てる。
Comments:0
Trackbacks:1
- Trackback URL for this entry
- http://sinsengumi.net/blog/2011/12/generics%ef%bc%88java%ef%bc%89%e3%81%ae%e5%9e%8b%e6%b6%88%e5%8e%bb%e3%81%ab%e3%81%a4%e3%81%84%e3%81%a6/trackback/
- Listed below are links to weblogs that reference
- Generics(Java)の型消去について from sinsengumi血風録
- pingback from なぜ Java の配列は共変で、Generics は共変ではないのか - sinsengumi血風録 2011年12月12日
[...] トリーでも書いてます(Generics(Java)の型消去について) [...]