2014-10-14 2 views
0

Абстрактный от Шилдт книги на Java,Стирание в Java Generics

После этих двух классов компилируются, Т в Ген будет заменен на объект. T в GenStr будет заменен на String.

Вы можете это подтвердить, запустив javap на своих скомпилированных классах. Результаты показаны здесь:

class Gen extends java.lang.Object{ 
    java.lang.Object ob; 
    Gen(java.lang.Object); 
    java.lang.Object getob(); 
} 


class GenStr extends java.lang.Object{ 
    java.lang.String str; 
    GenStr(java.lang.String); 
    java.lang.String getstr(); 
} 

EDIT: Эти 2 приведенные выше выходы из книги Герберта.

//Here, T is bound by Object by default. 
class Gen<T> { 

    T ob; // here, T will be replaced by Object 

    Gen(T o) { 
     ob = o; 
    } 

    // Return ob. 
    T getob() { 
     return ob; 
    } 
} 


//Here, T is bound by String. 
class GenStr<T extends String> { 
    T str; // here, T will be replaced by String 

    GenStr(T o) { 
     str = o; 
    } 

    T getstr() { 
     return str; 
    } 
} 

После запуска javap в затмении на этих файлах, мои результаты:

class erasure.Gen<T> { 
    T ob; 

    erasure.Gen(T); 
    Code: 
     0: aload_0  
     1: invokespecial #13     // Method java/lang/Object."<init>":()V 
     4: aload_0  
     5: aload_1  
     6: putfield  #16     // Field ob:Ljava/lang/Object; 
     9: return   

    T getob(); 
     Code: 
     0: aload_0  
     1: getfield  #16     // Field ob:Ljava/lang/Object; 
     4: areturn   
    } 

и GenStr.java:

class erasure.GenStr<T extends java.lang.String> { 
    T str; 

    erasure.GenStr(T); 
    Code: 
     0: aload_0  
     1: invokespecial #13     // Method java/lang/Object."<init>":()V 
     4: aload_0  
     5: aload_1  
     6: putfield  #16     // Field str:Ljava/lang/String; 
     9: return   

    T getstr(); 
    Code: 
     0: aload_0  
     1: getfield  #16     // Field str:Ljava/lang/String; 
     4: areturn  
} 

Проблема в том, что я не получаю выход как Об этом говорит Герберт Шильдт. Я не вижу, чтобы T заменялся классами Object или String в приведенных выше сценариях.

+0

Зачем отрицательный? Я попросил дать ответ, почему вывод так отличается от того, который дал Герберт. –

+0

Если вы не опубликуете результат, полученный Хербет Шильдтом, на ваш вопрос могут ответить только те, у кого есть книга. – EJP

+0

@EJP: Что я могу сделать, когда люди не пройдут правильно? Это было с самого начала. –

ответ

4

"После запуска javap в затмении на эти файлы, мои результаты ..."

No. Таковы результаты выполнения javap -c.

6: putfield  #16     // Field str:Ljava/lang/String; 

Вы этого не видите?

1: getfield  #16     // Field str:Ljava/lang/String; 

или что?

+0

Почему T все еще там? и так много разностей b/w выходов. –

+0

@ShirgillAnsari (1), потому что это подпись метода и (2), потому что это разница между '' и' ', о которых вы спрашиваете. Вот эти. Те, которые вы утверждали, не существовали. Прими решение. Либо они там, либо нет. – EJP

+0

Не между моими программами. Это ч/б Герберт и я. –

Смежные вопросы