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