我有一个 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/