为什么我不能使用覆盖注释?

时间:2015-04-08 22:19:26

标签: java inheritance subclass superclass method-overriding

我有一个扩展另一个类的类:

public class PDFCrawler extends WebCrawler

我在我的PDFCrawler类中重写了一个方法,如下所示:

@Override
    public boolean shouldVisit(Page page, WebURL url) {...}

它给了我关于Eclipse的错误。为项目设置了Java 8:

  

PDFCrawler类型的方法shouldVisit(Page,WebURL)必须覆盖   或实现超类型方法。

但是,在同一个PDFCrawler类中,当我按如下方式覆盖其他方法时,不会显示错误:

@Override
    public void visit(Page page) {...}

这两个方法都来自名为WebCrawler的超类。超类方法如下:

public boolean shouldVisit(Page page, WebURL url) {
    return true;
  }

public void visit(Page page) {
    // Do nothing by default
    // Sub-classed should override this to add their custom functionality
  }

超类取自Crawler4j project。因为我无法覆盖第一个方法,所以超类中的方法总是被执行。

有任何线索吗?

修改 我的类PDFCrawler的导入语句:

package com.example.ict;

import java.io.File;
import java.io.IOException;
import java.util.UUID;
import java.util.regex.Pattern;

import com.google.common.io.Files;

import edu.uci.ics.crawler4j.crawler.Page;
import edu.uci.ics.crawler4j.crawler.WebCrawler;
import edu.uci.ics.crawler4j.url.WebURL;

3 个答案:

答案 0 :(得分:3)

我猜你正在使用旧版crawler4j中的jar文件。此方法的签名在过去是不同的,并且在不支持向后兼容性的情况下进行了更改(不幸的是):https://github.com/yasserg/crawler4j/commit/c874761011d63e77977b914810eb44c054845233

使用最新版本的jar应解决问题。

答案 1 :(得分:0)

PDFCrawler.shouldVisit方法使用不同的参数类型。很可能这些类型来自不同的包。

答案 2 :(得分:0)

您对WebURL的导入是错误的,这将有效:

public boolean shouldVisit(Page page, edu.uci.ics.crawler4j.url.WebURL url) {...}
您在其他Page中使用

@Override,可以,但不是WebURL,所以最好修复导入!