簡體   English   中英

javap和泛型的類型擦除

[英]javap and generics' type erasure

我正在閱讀有關Java泛型中的類型擦除的Herbert Schilds。 假設在類上運行javap應該為我提供有關類型擦除后有關public,包保護和受保護字段以及方法的字節碼信息。 但是,我編寫了以下課程:

    class Ambiguity<T, V extends String>{
    T ob1;
    V ob2;

    void set(T o){
        ob1 = o;
    }

    void set(V o){
        ob2 = o;
    }
}

並在生成的類文件上運行javap並獲得以下輸出

從“ Test.java”編譯

class Ambiguity<T, V extends java.lang.String> {
  T ob1;
  V ob2;
  Ambiguity();
  void set(T);
  void set(V);
}

根據我閱讀的內容,我期待的輸出看起來像這樣。

Compiled from "Test.java"
class Ambiguity<java.lang.Object, java.lang.String> {
  java.lang.Object ob1;
  java.lang.String ob2;
  Ambiguity();
  void set(java.lang.Object);
  void set(java.lang.String);
}

我在這里想念什么嗎? 我應該補充一點,我理解以上述方式重載方法不是一個好習慣。 我只是看到有興趣在這種歧義下看到javap的結果。

編輯:這似乎是javap中新修復程序的結果。 http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4870651

如果我從JDK 1.6運行javap,則會得到預期的結果。 如果我從最初使用的JDK 1.7 b30運行javap,則將獲得帶有通用信息的結果。

我不確定。 但似乎signature屬性是在jvm 7中引入的(請參閱jvm規范)

此屬性將捕獲用於調試和反射api的簽名信息。

要查看signature屬性,請使用javap -v <class>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM