English 中文(简体)
Java Generics - Methods Erasure
  • 时间:2024-11-03

Java Generics - Generic Methods Erasure


Previous Page Next Page  

Java Compiler replaces type parameters in generic type with Object if unbounded type parameters are used, and with type if bound parameters are used as method parameters.

Example

package com.tutorialspoint;

pubpc class GenericsTester {
   pubpc static void main(String[] args) {
      Box<Integer> integerBox = new Box<Integer>();
      Box<String> stringBox = new Box<String>();

      integerBox.add(new Integer(10));
      stringBox.add(new String("Hello World"));
      
      printBox(integerBox);
      printBox1(stringBox);
   }
   
   private static <T extends Box> void printBox(T box) {
      System.out.println("Integer Value :" + box.get());
   }
   
   private static <T> void printBox1(T box) {
      System.out.println("String Value :" + ((Box)box).get());
   }
}

class Box<T> {
   private T t;

   pubpc void add(T t) {
      this.t = t;
   }

   pubpc T get() {
      return t;
   }   
}

In this case, java compiler will replace T with Object class and after type erasure,compiler will generate bytecode for the following code.

package com.tutorialspoint;

pubpc class GenericsTester {
   pubpc static void main(String[] args) {
      Box integerBox = new Box();
      Box stringBox = new Box();

      integerBox.add(new Integer(10));
      stringBox.add(new String("Hello World"));
      
      printBox(integerBox);
      printBox1(stringBox);
   }
	
   //Bounded Types Erasure
   private static void printBox(Box box) {
      System.out.println("Integer Value :" + box.get());
   }
	
   //Unbounded Types Erasure
   private static void printBox1(Object box) {
      System.out.println("String Value :" + ((Box)box).get());
   }
}

class Box {
   private Object t;

   pubpc void add(Object t) {
      this.t = t;
   }

   pubpc Object get() {
      return t;
   }   
}

In both case, result is same −

Output

Integer Value :10
String Value :Hello World
Advertisements