这种方法允许类扩展通用类或实现通用接口(带有具体的类型参数)以仍然用作原始类型。
想象一下:
public class MyComparator implements Comparator {
public int compare(Integer a, Integer b) {
//
}
}
这不能以其原始形式使用,传递两个Objects进行比较,因为类型被编译到compare方法中(与之相反,如果通用类型参数T会删除类型,则会发生这种情况)。因此,在后台,编译器添加了一个“ bridge method”,看起来像这样(是Java源代码):
public class MyComparator implements Comparator {
public int compare(Integer a, Integer b) {
//
}
//THIS is a "bridge method"
public int compare(Object a, Object b) {
return compare((Integer)a, (Integer)b);
}
}
编译器保护对bridge方法的访问,强制直接对其进行显式调用会导致编译时错误。现在,该类也可以以其原始形式使用:
Object a = 5;
Object b = 6;
Comparator rawComp = new MyComparator();
int comp = rawComp.compare(a, b);
为什么还需要它?
除了增加对原始类型的显式使用(主要是为了向后兼容)的支持之外,还需要桥接方法来支持类型擦除。使用类型擦除,方法如下:
public T max(List list, Comparator comp) {
T biggestSoFar = list.get(0);
for ( T t : list ) {
if (comp.compare(t, biggestSoFar) > 0) {
biggestSoFar = t;
}
}
return biggestSoFar;
}
实际上被编译成与此兼容的字节码:
public Object max(List list, Comparator comp) {
Object biggestSoFar = list.get(0);
for ( Object t : list ) {
if (comp.compare(t, biggestSoFar) > 0) { //IMPORTANT
biggestSoFar = t;
}
}
return biggestSoFar;
}
如果bridge方法不存在,并且您向此函数传递了a List和a MyComparator,则在被标记行的调用IMPORTANT将失败,因为MyComparator没有被调用的方法compare需要两个Objects ...只有一个方法需要两个Integers。
以下常见问题是一本好书。