Java The Complete Reference, Seventh Edition

(Greg DeLong) #1

352 Part I: The Java Language


}

// A subclass of Gen.
class Gen2 extends Gen<String> {

Gen2(String o) {
super(o);
}

// A String-specific override of getob().
String getob() {
System.out.print("You called String getob(): ");
return ob;
}
}

// Demonstrate a situation that requires a bridge method.
class BridgeDemo {
public static void main(String args[]) {

// Create a Gen2 object for Strings.
Gen2 strOb2 = new Gen2("Generics Test");

System.out.println(strOb2.getob());
}
}

In the program, the subclassGen2extendsGen, but does so using aString-specific version
ofGen, as its declaration shows:

class Gen2 extends Gen<String> {

Furthermore, insideGen2,getob( )is overridden withStringspecified as the return type:

// A String-specific override of getob().
String getob() {
System.out.print("You called String getob(): ");
return ob;
}

All of this is perfectly acceptable. The only trouble is that because of type erasure, the
expected form ofgetob( )will be

Object getob() { // ...

To handle this problem, the compiler generates a bridge method with the preceding signature
that calls theStringversion. Thus, if you examine the class file forGen2by usingjavap, you
will see the following methods:

class Gen2 extends Gen{
Gen2(java.lang.String);
java.lang.String getob();
java.lang.Object getob(); // bridge method
}
Free download pdf