Niespójność klasy wewnętrznej Java między atrybutem deskryptora a podpisem? (plik klasy)

Próbuję zrozumieć, czy w specyfikacji istnieje powód rozbieżności między deskryptorami Java i sygnaturami dla klas wewnętrznych. (Patrzę bezpośrednio na zawartość plików klas tutaj, ale do zilustrowania używam javap).

(n.b. Próbowałem tego na JDK 1.6.0_33 i 1.7.0_05, oba mają ten sam problemoglądany z javapem z Java 7 - javap java 6 nie pokazuje żadnych ogólnych informacji o podpisie, zgodnie z odpowiedzią Seana poniżej. )

Aktualizacja: Dzięki tym dyskusjom - moje podejście jest

Deskryptor (który nie zawiera ogólnych informacji) jest poprawny.Podpis (który jest atrybutem metody i zawiera informacje ogólne) jest niepoprawny. Odpowiedni wpis ConstPool dla PODPISU metody <init> to „ConstantUTF8 [(Ljava / util / list <TE;>) V]”Javap w Javie 6 nie przegląda podpisu, tylko deskryptor. (Zgaduję że!)

W przypadku, gdy ktoś się zastanawia, trafiłem na to bez użycia JAVAP, po prostu patrząc na pliki klas, używam tylko javap, aby to pokazać. (więc raczej nie będzie to błąd javap).

Rozważać:

public class InnerClassTest1 {

  public int getX() {
    return new Inner1(new ArrayList<String>()).getX(4);
  }

  public class Inner1 {
    private final List arg;

    public Inner1(List arg) {
        this.arg = arg;
    }....

vs

public class InnerClassTest2 {

   public int getX() {
      return new Inner1(new ArrayList<String>()).getX(4);
   }

   public class Inner1<E> {
    private final List<E> arg;

    public Inner1(List<E> arg) {
        this.arg = arg;
    }.....

Jeśli spojrzysz na wyjście javap -cs na klasach wewnętrznych, są zaskakująco różne!

public org.benf.cfr.tests.InnerClassTest1 $ Inner1 (org.benf.cfr.tests.InnerClassTest1, java.util.List); Podpis: (Lorg / benf / cfr / tests / InnerClassTest1; Ljava / util / List;) V

vs

public org.benf.cfr.tests.InnerClassTest2 $ Inner1 (java.util.List <E>); Podpis: (Lorg / benf / cfr / tests / InnerClassTest2; Ljava / util / List;) V

...ten, który używa generycznych, nie ma domyślnego parametru dla klasy zewnętrznej! (jest poprawnie obecny w InnerClassTest1).

Nie mogę znaleźć niczego w dokumentacji pliku klas, aby to wyjaśnić - czy ktoś wie, dlaczego tak może być?

Dzięki!

Zawietrzny.

Aktualizacja -

Umieściłem przykładowe pliki whttp://www.benf.org/files/innerClassTest.tgz

Biorąc pod uwagę odpowiedź Seana poniżej, próbowałem użyć javap w java 6 i widziałem identyczne wyjście dla obu, bez ogólnych informacji - to prowadzi mnie do przekonania, że ​​javap java 6 nie wyświetla pełnej informacji o podpisie?

Dokładne dane wyjściowe, które otrzymuję za pomocą javap na 1.7.0_05-b06 to

public class org.benf.cfr.tests.InnerClassTest2$Inner1<E> {
 final org.benf.cfr.tests.InnerClassTest2 this$0;
 Signature: Lorg/benf/cfr/tests/InnerClassTest2;

public org.benf.cfr.tests.InnerClassTest2$Inner1(java.util.List<E>);
 Signature: (Lorg/benf/cfr/tests/InnerClassTest2;Ljava/util/List;)V
 Code:
   0: aload_0       
   1: aload_1       
   2: putfield      #1                  // Field this$0:Lorg/benf/cfr/tests/InnerClassTest2;
   5: aload_0       
   6: invokespecial #2                  // Method java/lang/Object."<init>":()V
   9: aload_0       
  10: aload_2       
  11: putfield      #3                  // Field arg:Ljava/util/List;
  14: return        

public int getX(int);
  Signature: (I)I
  Code:
   0: iconst_2      
   1: ireturn       
}

questionAnswers(2)

yourAnswerToTheQuestion