Erasure in Java Generics

An abstract from Herbert Schildt book on Java,

After these two classes are compiled, the T in Gen will be replaced by Object. The T in GenStr will be replaced by String.

You can confirm this by running javap on their compiled classes. The results are shown here:

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: These 2 above are the outputs from the Herbert book.

//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;
    }
 }

After running javap in eclipse on these files, my results are:

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        
  }

and for 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       
 }

The problem is I am not getting the output as Herbert Schildt mentions. I don't see either T being replaced by Object or String classes in above scenarios.

Upvotes: 0

Views: 70

Answers (1)

user207421
user207421

Reputation: 310840

"After running javap in eclipse on these files, my results are ..."

No. Those are the results of running javap -c.

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

You don't see that?

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

or that?

Upvotes: 4

Related Questions