如果参数类型完全匹配,则方法可以覆盖另一个方法,但您的方法不匹配。尽管EnumSet<FetchMode>
是 的子类型EnumSet<?>
,但它们并不完全相同。您没有覆盖get(EnumSet<?> fetchModes);
子类中的超类方法,而是使用不同的参数类型重载它。当您检查或反编译字节码时,由于擦除,这两者具有相同的签名,get(EnumSet fetchModes)
并且您的编译器开始抱怨。
这在 JLS §8.4.8.1中有介绍:
一个类不能有两个具有相同名称和类型擦除的成员方法
解决问题的一个天真的尝试是更改参数类型,使其与超类的参数类型兼容,在您的子类中正确覆盖该方法。
@Override
public void get(EnumSet<?> fetchModes) {
}
虽然这修复了编译器错误,但它仍然不够优雅,因为它允许您的 EnumSet 存储任何对象。但理想情况下,您可能希望它仅存储 Enum 的某些子类型。这个成语支持这一点。
您需要做的是声明一个具有有界类型参数的泛型接口,然后通过正确覆盖该方法来实现它,如下所示。
public interface A<E extends Enum<E>> {
void get(EnumSet<E> fetchModes);
}
public class B implements A<FetchMode> {
@Override
public void get(EnumSet<FetchMode> fetchModes) {
}
}