我正在扩展一个类以及实现一个接口,它们都包含一个名为doFilter
的方法,它是我的超类中的最后一个方法,当然还有一个来自我界面的抽象方法。所以,现在我收到了编译错误。
我该如何解决这个问题。
我的过滤器类是:
public class MyCacheFilter extends CachingFilter implements Filter {
// here is error, as compiler is thinking I am overriding dofilter of
// CacheFilter, although I have not specified any @Override annotation
public doFilter() {
}
}
答案 0 :(得分:3)
如果方法由CachingFilter
提供,则您无需在MyCacheFilter
中提供实施。 (事实上,正如您所发现的那样,不能。)
如果您确实希望doFilter
的行为与CachingFilter
提供的行为不同,则继承不是一种选择。在这种情况下,请考虑使用组合:
public class MyCacheFilter implements Filter {
CachingFilter cachingFilter = ...
@Override
public void doFilter() {
...
possibly refer to cachingFilter...
...
}
public String otherMethod() {
// delegate to cachingFilter
return cachingFilter.otherMethod();
}
}
[...]虽然我没有指定任何@Override注释
您是否明确提供@Override
并没有什么不同。
答案 1 :(得分:1)
问题是该方法在超类中声明为 final 。这意味着,从字面上看,“这种方法不能被覆盖”。如果您需要在doFilter()
中放置自己的逻辑,则无法扩展CachingFilter。
在的Java中没有概念,其中覆盖了一个方法。界面是合同,告诉其他人你的班级可以做什么。完整的合同是实现的所有接口的总和。如果在多个接口中存在相同的方法签名并不重要。该课程是合同的实施。
继承从顶部开始(即Object),每个重写方法将任何父项中的任何预先存在的定义替换为公开公开的方法 - 除外,如果声明了方法final
。这告诉编译器不允许覆盖此方法实现,这是它的 final 版本。
CachingFilter
来自哪个,但是在其他框架或java标准API之上的框架中的一个共同模式是创建API的最终实现 - 必需的方法(在这种情况下为doFilter()
),但添加从internalDoFilter()
调用的另一个“内部”方法(如doFilter()
)。扩展类可以安全地覆盖“内部”方法,同时仍然保证doFilter()
中的任何基本逻辑仍然可以正确执行。
答案 2 :(得分:0)
不幸的是,除了重新考虑你的班级设计之外,没有办法直接解决这些冲突。你可以
MyCacheFilter
更改为包含一个CachingFilter
而不是从中继承,或答案 3 :(得分:0)
如果CachingFilter.dofilter()可用,它将是您的子类中的方法。所以你不需要覆盖它。如果你想覆盖,方法不应该是最终的。
答案 4 :(得分:0)
尝试以匿名方式实现界面。
public class MyClass extends MySuperClass implements MyInterface{
MyInterface myInterface = new MyInterface(){
/* Overrided method from interface */
@override
public void method1(){
}
};
/* Overrided method from superclass*/
@override
public void method1(){
}
}