请考虑以下代码:
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)}
答案 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)