我有一个名为DMSServiceLocator.class的服务定位器类,其中有一个方法名为getParser(),返回类型为Parser。我正试图返回一个名为AutoMateParser的服务,该服务带有一个扩展Parser的Impl,但我遇到了一个编译错误,说Parser是必需的,找到了AutoMatePParser。当我返回新的AutoMateServiceImpl()而不是我的服务接口时,我不会收到编译错误。我的getParser()方法似乎没有实现autoMateParser是同一类型的。我尝试用Parser转换AutoMateParser,"return(Parser)autoMateParsr;",它解决了编译错误,但收到了一个转换异常。我想知道是否有人知道怎么做。提前谢谢。
下面是我的代码示例。
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);
}
您正试图返回类型为AutoMateParser
的对象。该接口不是Parser
的子类型(只有AutoMateParserImpl
是),因此编译器会抱怨。您需要重新思考您的类层次结构。
您可以使用parseCar
方法提取一个Parser
接口,让AutoMateParser
扩展该接口,创建一个实现Parser
接口的抽象ParserImpl
类,并让您的服务定位器返回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();
}
}
}