如何重写包含泛型方法的UrgencyQueue接口方法?
解决泛型重写的名称冲突问题
错误根源
你碰到的问题核心是方法级泛型声明和类级泛型参数冲突:
- 你的抽象类
BaseLinkedUrgencyQueue本身是泛型类(带有<Type>参数) - 你在
dequeue方法上额外声明了<Type>泛型,这个局部泛型和类的泛型参数重名。编译时类型擦除后两者签名一致,但编译器不认为这是合法重写,反而判定为名称冲突。
解决方法
- 删掉方法上的泛型声明:
dequeue方法不需要自己定义泛型,直接使用类级别的泛型参数即可。 - 确保类与接口的泛型绑定一致:类声明要明确指定接口的泛型参数和类的泛型匹配,比如
BaseLinkedUrgencyQueue<Type> implements UrgencyQueue<Type>。
修正后的代码示例
public abstract class BaseLinkedUrgencyQueue<Type> implements UrgencyQueue<Type> { @Override public void dequeue(Consumer<Type> action) { throw new UnsupportedOperationException("Method: not implemented."); } }
补充说明
接口UrgencyQueue的dequeue方法应该是基于接口自身泛型定义的(比如UrgencyQueue<E>中的void dequeue(Consumer<E> action)),你的类实现接口时,用类的Type泛型替代了接口的泛型参数。此时重写方法不需要再声明泛型,直接复用类的泛型就能和接口方法签名完全匹配,编译器会认可这是合法的重写。
内容的提问来源于stack exchange,提问作者Bryce Wellman
相关产品推荐
相关产品推荐

