考虑以下代码:
List<Integer>ints= new ArrayList<Integer>();
lst.add(new Object());//no suitable method found for add(Object)...
为什么会导致这个错误?在编译时,我们进行类型擦除,擦除后的方法
boolean add (E e)
将具有签名add(Object o)
。你能详细写一下编译器在这种情况下是如何工作的吗?
桥接法又如何呢?据我了解,桥接方法有以下实现:
boolean add(Object o){return this.add((Integer) o)}
类型擦除发生在编译器执行类型检查之后。 如果是相反的话,泛型就没有意义了!
lst.add(new Object());
在运行时,您在编译时对其进行评估。编译时没有方法
List<Integer>#add(Object)
。
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)