java - 参数化类和方法 : making a method returns a correct type with java generics

标签 java generics

我有一个 AbstractExtractionRules 类,它的构造函数接收一个 ParserAPI 对象。 AbstractExtractionRules 将使用许多不同的解析器 API 来实现,并且每个 API 都使用自己的“文档”抽象。

ParserAPI 类有一个参数化类型,表示方法 parseDocument 的返回类型。

我想要一种无需强制转换即可在 AbstractExtractionRules 子类中使用 ParserAPI 的方法,以更自然的方式保留它。

我认为使用 Java 泛型,或许可以相应地修改构造函数参数或修改对 getParserAPI().parseDocument(htmlCode) 的调用我可以做到这一点,但我不知道该怎么做。

@FunctionalInterface
public interface ExtractionRules<T> {
    List<T> extract(String htmlCode);
}

public interface ParserAPI<T> {
    T parseDocument(String htmlCode);
}

public abstract class AbstractExtractionRules <T> implements ExtractionRules <T> {
    private ParserAPI<?> parserAPI;

    public AbstractExtractionRules(ParserAPI<?> parserAPI) {
        this.parserAPI = parserAPI;
    }

    public ParserAPI<?> getParserAPI() {
        return parserAPI;
    }
}


public class RibeiraoVisitorRule extends AbstractExtractionRules <String> {

    public RibeiraoVisitorRule(ParserAPI<Document> parserAPI) {
        super(parserAPI);
    }

    @Override
    public List extract(String htmlCode) {
        List<String> list = new ArrayList<>();


        Document doc = (Document) getParserAPI().parseDocument(htmlCode);

        Elements submenu = doc.select("a.new_sub_menu");
        submenu.forEach(element1 -> {
            String href = element1.attr("abs:href");
            list.add(href.concat("&pageNum=VER-TUDO"));
        });
        return list;
    }
}

最佳答案

您可以将类型从 AbstractExtractionRules 传递到 ParserAPI:

public abstract class AbstractExtractionRules<A, T> implements ExtractionRules<T> {
    private ParserAPI<A> parserAPI;

那么在具体的实现类中就可以不用cast调用了:

public class RibeiraoVisitorRule extends AbstractExtractionRules<Document, String> {

    @Override
    public List<String> extract(String htmlCode) {
        ...
        Document doc = getParserAPI().parseDocument("");
    }

请注意,我还向 ExtractionRules 接口(interface)添加了传递类型 T。它影响 extract() 方法的返回类型。在您的示例中,您没有传递类型,因此方法的返回类型为 List

关于java - 参数化类和方法 : making a method returns a correct type with java generics,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35118880/

相关文章:

java - 如何处理java.io.InvalidClassException?

java - 如何在 Eclipse 中开始使用 FMJ?

java - 用 Java 表示卡片的类?

c# - 转换方法以使用任何枚举

swift - 无法将类型 'Int' 的值转换为泛型中预期的参数类型 'Int'

typescript - 获取用 typescript 写的

swift - 这个层次结构应该如何运作?

Java 方法出现 "Illegal start of expression"和 "' ;' expected"错误?

java - JBoss 7 类加载奇迹

从通用抽象类派生的类的 C# 方法重载问题