什么是Java泛型的桥方法

605 阅读1分钟

什么是泛型的桥方法

桥接方法(Bridge Method)用于继承或者实现泛型类时保证多态性。

因为泛型在编译后会背擦除,所以才会有桥方法。

注意:桥方法是编译器自动生成的非手写

举例说明

public class GenericBridgeTest {
    public static void main(String[] args) {
        Class<DemoServiceImpl> demoClass = DemoServiceImpl.class;
        Method[] methods = demoClass.getDeclaredMethods();
        for (Method method : methods) {
            System.out.println(method.getName() + ":" + method.getReturnType());
        }
    }
}

interface DemoService<T> {
    T getData();
}

class DemoServiceImpl implements DemoService<Integer> {
    @Override
    public Integer getData() {
        return Integer.MAX_VALUE;
    }
}

此时的输出为

getData:class java.lang.Integer
getData:class java.lang.Object

这里呢,我们会发现DemoServiceImpl类多了一个返回值类型是ObjectgetData方法,这就是桥方法

其实就相当于,在程序运行的过程中DemoServiceImpl类是下面这个样子

class DemoServiceImpl implements DemoService<Integer> {
    @Override
    public Integer getData() {
        return Integer.MAX_VALUE;
    }

    // public Object getData() 是编译器自动生成的
    // 这里如果你手动写上下面方法会出下面下面异常
    // 'getData()' is already defined in 'com.bulk.generic.DemoServiceImpl'
    public Object getData() {
        return Integer.MAX_VALUE;
    }
}

interface DemoService<T> 在泛型擦除后,其实会变成interface DemoService<Object>,对应的T getData();方法也会转变为Obejct getData();。而且在其实现类中并没有重写该方法,所以编译器会自动在其实现类 DemoServiceImpl 中,自动生成桥方法Object getData()

  • END -