我有一个名为DMSServiceLocator.class的服务定位器类,我在其中有一个名为getParser()的方法,其返回类型称为Parser。我正在尝试使用扩展Parser的Impl返回一个名为AutoMateParser的服务,但是我得到一个编译错误,说Parser是必需的,找到了AutoMateParser。当我返回新的AutoMateServiceImpl()而不是我的服务接口时,我没有收到编译错误。它似乎没有出现我的getParser()方法实现autoMateParser属于同一类型。我尝试使用Parser投射AutoMateParser,“return(Parser)autoMateParser;”它解决了编译错误,但收到了强制转换异常。我想知道是否有人知道如何做到这一点。提前谢谢。
下面的是我的代码示例。
AppModule.class
public static void bind(ServiceBinder binder) {
binder.bind(AutoMateParser.class, AutoMateParserImpl.class);
}
DMSServiceLocator.class
public class DMSServiceLocator {
@Inject
private AutoMateParser autoMateParser;
public Parser getParser() {
if(automate) {
return autoMateParser();
} else {
//Different data scrubber, but also extends Parser
return homenetParser();
}
}
}
AutoMateParserImpl.class
public class AutoMateParserImpl extends Parser implements AutoMateParser {
protected Vehicle parseCar(String vehicleData) {
//some data scrubbing code
}
}
Parser.class
public abstract class Parser {
//some csv line reader code
protected abstract Vehicle parseCar(String carData);
}
答案 0 :(得分:1)
您正在尝试返回AutoMateParser
类型的对象。该接口不是Parser
的子类型(仅AutoMateParserImpl
是),因此编译器会抱怨。您需要重新考虑您的类层次结构。
您可以使用Parser
方法提取parseCar
接口,使AutoMateParser
扩展该接口,创建实现ParserImpl
接口的抽象Parser
类,并让您的服务定位器返回Parser
接口类型而不是抽象实现。
编辑:类型可能如下所示:
public interface Parser {
//public methods that you need to call
}
public interface AutoMateParser extends Parser {
//any extra or overriden method declarations
}
public abstract class AbstractParser implements Parser {
//common code and implemented methods
protected abstract Vehicle parseCar(String carData);
}
public class AutoMateParserImpl extends AbstractParser implements AutoMateParser {
//any extra or overriden method implementations defined in AutoMateParser
protected Vehicle parseCar(String vehicleData) {
...
}
}
public class DMSServiceLocator {
@Inject
private AutoMateParser autoMateParser;
//more services
public Parser getParser() {
if(automate) {
return autoMateParser();
} else {
//Different data scrubber, but also extends Parser
return homenetParser();
}
}
}