如果你想让你的接口在返回类型中是通用的,我会建议扩展JoeC的评论。
自Java 8以来,有java.util.function
-package,为基本转换提供接口。特别是,界面Function
可以用于适合您的目的。我建议这样的实现:
// file: Parser.java
import java.util.function.Function;
public abstract class Parser<R> implements Function<String, R> {
@Override
public final R apply(String document) {
return (this.parse(document));
}
abstract public R parse(String document);
}
对于上面的例子中的一个实例是这样的:
String document = ...;
Parser<Map<K, V>> mapParser = ...; // instantiate a fitting Parser
Map<K, V> result = mapParser.parse(document);
(鉴于K
和V
在这个代码块称为通用参数)。
你可以进一步指定的接口来获得较为简单的语法:
// file: MapParser.java
import java.util.Map;
public abstract class MapParser<K, V> extends Parser<Map<K, V>> {}
有了这个(空)接口,您可以重新WIRTE上面的代码为:如前所述
String document = ...;
MapParser<K, V> mapParser = ...; // instantiate a fitting MapParser
Map<K, V> result = mapParser.parse(document);
通过@matoni,可以编写接口IParser
和IMapParser
并在其上设置抽象类别Parser
和MapParser
:
个
的接口提供了一种用于自一个class
用户可以实现多个interface
S比的灵活性,但只有extends
一个其它class
。然而,不利的是,接口IParser
和IMapParser
的开发人员无法强制执行该方法apply(...)
不能被覆盖。因此,理论上,Parser
的实施者可以不同地实施apply(...)
和parse(...)
,这可能导致意外的行为。当使用抽象类Parser
和MapParser
时,开发人员确实会强制执行apply(...)
调用parse(...)
并因此具有一致的行为。
'分析器'也许? –
像'public interface Parser {E parse(String document); }'? –
4castle
@ 4castle我是新来的接口,可以向我解释它是如何工作的(你在这里提到的那个) – user3407267