1

考虑以下代码:

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 在这种情况下是如何工作的吗?

那么桥接法呢?据我了解,桥接方法具有以下工具:

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

3 回答 3

7

类型擦除发生编译器执行类型检查之后。如果反过来,泛型就没有意义了!

于 2013-09-26T15:39:38.483 回答
1

你不评价

lst.add(new Object()); 

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

于 2013-09-26T15:39:46.847 回答
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)

于 2013-09-26T15:44:36.780 回答