类型擦除和桥接方法

时间:2013-09-26 15:38:10

标签: java generics compiler-construction bridge

请考虑以下代码:

List<Integer>ints= new ArrayList<Integer>();
lst.add(new Object());//no suitable method found for add(Object)...

为什么会出现此错误?在编译时我们有类型擦除,擦除后的方法boolean add (E e)将有签名add(Object o)。你能否详细说明ompiler在这种情况下的工作方式?

那么桥接方法呢?据我所知,bridge metod有以下工具:

boolean add(Object o){return this.add((Integer) o)}

3 个答案:

答案 0 :(得分:7)

编译器执行类型检查后,类型擦除发生。如果是相反的方式,那么泛型就没有意义了!

答案 1 :(得分:1)

您没有评估

lst.add(new Object()); 

在运行时,您正在编译时对其进行评估。在编译时,没有方法List<Integer>#add(Object)

答案 2 :(得分:1)

桥接方法在类定义中,而不在方法中,例如:

public class Test implements Comparable<Test> {

    public int compareTo(Test o) {
        return ...;
    }
...

编译器会在这里添加一个桥接方法(不可见)

public int compareTo(Object o) {
    return compareTo((Test)o);
}

因为字节码中的Comparable接口具有int compareTo(Object o)方法,并且JVM检测到该类实现了此方法,所以类需要int compareTo(Object o)