Абстрактный от Шилдт книги на 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 в приведенных выше сценариях.
Зачем отрицательный? Я попросил дать ответ, почему вывод так отличается от того, который дал Герберт. –
Если вы не опубликуете результат, полученный Хербет Шильдтом, на ваш вопрос могут ответить только те, у кого есть книга. – EJP
@EJP: Что я могу сделать, когда люди не пройдут правильно? Это было с самого начала. –