类型擦除和桥接方法

问题描述 投票:0回答:3

考虑以下代码:

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)}
java generics bridge
3个回答
7
投票

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


1
投票

lst.add(new Object());

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

    


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)
    

© www.soinside.com 2019 - 2024. All rights reserved.