gpt4 book ai didi

Java泛型——桥接方法

转载 作者:行者123 更新时间:2023-12-02 00:40:23 25 4
gpt4 key购买 nike

说到桥接方法,我确实知道如果有需要的话,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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com