什么是泛型的桥方法
# 什么是泛型的桥方法
桥接方法(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;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
此时的输出为
getData:class java.lang.Integer
getData:class java.lang.Object
1
2
2
这里呢,我们会发现DemoServiceImpl
类多了一个返回值类型是Object
的getData
方法,这就是桥方法
其实就相当于,在程序运行的过程中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;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
interface DemoService<T>
在泛型擦除后,其实会变成interface DemoService<Object>
,对应的T getData();
方法也会转变为Obejct getData();
。而且在其实现类中并没有重写该方法,所以编译器会自动在其实现类 DemoServiceImpl
中,自动生成桥方法Object getData()
。
上次更新: 2022/11/27, 16:23:17