2017-09-27 16 views
-1

javapを使用してMapクラスを逆コンパイルしました。クラス定義には、ジェネリック型KとVの存在がまだ示されています。 これは型消去の概念によって消去されているはずです。なぜそれは起こりませんか?タイプ消去はJavaマップクラスでは機能しません

./javap -verbose java.util.Map

Classfile jar:file:/opt/jdk1.8.0_101/jre/lib/rt.jar!/java/util/Map.class 
    Last modified 22 Jun, 2016; size 4127 bytes 
    MD5 checksum 238f89b3e2ff9bebe07aa22b0a3493a9 
    Compiled from "Map.java" 

public interface java.util.Map<K extends java.lang.Object, V extends java.lang.Object> 
    minor version: 0 
    major version: 52 
    flags: ACC_PUBLIC, ACC_INTERFACE, ACC_ABSTRACT 

Constant pool: 
+0

デバッグ情報が表示されます。 – EJP

+0

インターフェイス定義にはまだ汎用パラメータKとVがあります。型消去の概念で消去してはいけませんか? –

+0

はい、いいえ。型パラメータと汎用のスーパータイプについてはまだメタデータが含まれています。コンパイラがそれらが一般的であることを知る方法がないので、そうでなければ、あなたがソースコードを持っていない限り、ジェネリック型を消費することはできませんでした。しかし、そのメタデータはクラスファイル内の「余分な」情報です。 'javap'はこのメタデータを使って生の(消去された)シグネチャの代わりにジェネリックシグネチャを表示します。 –

答えて

0

デコード一般的な情報に使用され、バイトコード内の余分な情報があります。

関連する問題