先看下面的接口与接口实现

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
public interface AInterface<T> {
    void func(T t);
}

public class AClass implements AInterface<String> {
    @Override
    public void func(String s) {
        System.out.println(s);
    }
}

由于 Java 的泛型是要擦除的,所以当虚拟机看到的时候其实是下面这种情况

1
2
3
4
5
6
7
8
9
public interface AInterface {
    void func(Object t);
}

public class AClass implements AInterface {
    public void func(String s) {
        System.out.println(s);
    }
}

那么就有一个问题了,这接口实现类并没有实现接口中的方法,那么编译器是怎么解决这个问题的。

其实,编译出来之后,代码长成下面这样

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
public interface AInterface {
    void func(Object t);
}

public class AClass implements AInterface {
    public void func(String s) {
        System.out.println(s);
    }
    public void func(Object s) {
         this.func((String) s);
    }
}

这个新的方法就是桥接方法,我们可以通过反编译看到它。javap -p AClass.class

反编译的图片

通过反射可以获取到这个桥接方法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
public static void main(String[] args) throws Exception {
    AClass obj = new AClass();
    Method func = AClass.class.getMethod("func", String.class);
    func.invoke(obj, "AAA");
    System.out.println(func.isBridge());
    func = AClass.class.getMethod("func", Object.class);
    func.invoke(obj, "BBB");
    System.out.println(func.isBridge());
}

// output:
// AAA
// false
// BBB
// true

参考资料

  1. Java 反射中 method.isBridge () 由来,含义和使用场景?