说到桥接方法,我确实知道如果有需要的话,java编译器会添加它们,以便子类可以正确地完成重写(在阅读了 mughal 和angelikalanger网站的 SCJP 之后)。但这有点令人困惑,如下所示:
删除之前:
class x <T> {
void set(T t){}
}
class y <E> extends x {
void set(E e) {} // name clash here
}
class z<E> extends x {
void set(Object y) {} // no name clash here
}
class z1<E> extends x<T> {
void set(Object y) {} // name clash here
}
删除后:
class x {
void set (Object t) {}
}
我理解 y 类的名称冲突,但为什么 z 类没有名称冲突? z1 类也有名称冲突吗?令人困惑
最佳答案
class y <E> extends x {
void set(E e) {} // name clash here
}
这里发生名称冲突是因为 E 不是 T 的子类。所以你不能用这种方式重写 set 方法。请参阅 z1 的解释以更好地理解。 要使 y 类正常工作,您必须具有
class y <E> extends x<E> {
void set(E e) {}
}
下一个:
class z<E> extends x {
void set(Object y) {} // no name clash here
}
这里没有名称冲突,因为在类 X 中,set 方法被解释为
void set(java.lang.Object)
并且在类z中set的参数也是java.lang.Object.所以没有冲突。
下一个:
class z1<E> extends x<T> {
void set(Object y) {} // name clash here
}
这里再次发生名称冲突,因为您必须将您赋予 x 的任何类型参数作为 set 的参数。在这里,您传递给 x 类型参数 T,但 set 方法的参数为 java.lang.Object。因此名称冲突。
要使 z 工作,您必须具备:
class z1<E> extends x<Object> {
void set(Object y) {}
}
关于Java泛型——桥接方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6557586/