Java泛型——桥接方法

标签 java generics

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

相关文章:

java - 为什么我的线程在不同时间执行相同数量的工作?

java - 无需在浏览器中打开即可访问 URL,使用 Android 应用程序进行数字 LED 控制

java - tcResultSet oim 中列类型-3 的数据类型是什么?

oop - 在 TypeScript 中扩展 React 组件

java - 以编程方式分配时 CardView.setRadius() 不起作用

java - 任务栏进度

java - 为什么只允许在某些地方将子类传递给有界通配符?

Java:如何创建实现抽象接口(interface)的泛型类的实例?

c# - 我在实现通用存储库时遇到问题

java - Java中的递归接口(interface)类型参数