My Wiki!

Java Generics

1. Basics

2. Interfaces

Sometimes Java compiler must create synthetic methods (in this case called bridge methods) to make overriding work with generic types. For example:

interface TestInterface<T> {
    void consume(T value);
}

class TestClass implements TestInterface<Integer> {
    @Override
    public void consume(Integer value) {
        System.out.println(value);
    }
}
after type erasure becomes:

interface TestInterface {
	void consume(Object value);
}

class TestClass implements TestInterface {
    public void consume(Integer value) {
        System.out.println(value);
    }
}

and we can see that TestClass no longer overrides consume method from TestInterface. To solve this problem compiler adds following method to TestClass:

class TestClass implements TestInterface {
   // bridge method added by compiler:
   @Override public void consume(Object value) {
	 this.consume((Integer)value);
   }

   public void consume(Integer value) { ... }
}

Headline


Navigation