Java Tapestry5在服务定位器方法中返回服务接口时编译错误
我有一个名为DMSServiceLocator.class的服务定位器类,其中有一个名为getParser()的方法,返回类型为Parser。我试图返回一个名为AutoMateParser的服务,该服务带有一个扩展解析器的Impl,但是我得到一个编译错误,说需要解析器,发现AutoMateParser。当我返回新的AutoMateServiceImpl()而不是我的服务接口时,我没有收到编译错误。我的getParser()方法似乎没有意识到autoMateParser是同一类型的。我尝试使用解析器“return(Parser)AutoMateParser;”来转换AutoMateParser,该解析器解决了编译错误,但收到了转换异常。我想知道是否有人知道怎么做。提前谢谢 下面是我的代码示例 AppModule.classJava Tapestry5在服务定位器方法中返回服务接口时编译错误,java,spring,tapestry,Java,Spring,Tapestry,我有一个名为DMSServiceLocator.class的服务定位器类,其中有一个名为getParser()的方法,返回类型为Parser。我试图返回一个名为AutoMateParser的服务,该服务带有一个扩展解析器的Impl,但是我得到一个编译错误,说需要解析器,发现AutoMateParser。当我返回新的AutoMateServiceImpl()而不是我的服务接口时,我没有收到编译错误。我的getParser()方法似乎没有意识到autoMateParser是同一类型的。我尝试使用解析
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
的对象。该接口不是解析器
的子类型(只有AutoMateParserImpl
是),因此编译器会抱怨。您需要重新考虑您的类层次结构
您可以使用parseCar
方法提取Parser
接口,让AutoMateParser
扩展该接口,创建一个抽象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();
}
}
}
谢谢你的回复,不过我似乎真的对你建议的解决方案感到困惑。你能举个例子吗?另外,我还能够返回扩展解析器接口的不同服务吗?Thanks@George,我创建了一个示例。对如果类型层次结构如下所示,则返回
Parser
的不同子类确实有效。我已经实现了您的示例,并删除了除示例中的方法之外的所有方法,似乎仍然需要以下编译错误不兼容的类型:com.company.community.task.impls.impl.AbstractParser发现:你有什么想法吗?谢谢汉宁。我在tapestry之外开发了一个java应用程序,你的建议似乎很好用。显然我在我的tap应用程序中肯定做错了什么,所以今晚我得弄清楚。无论如何,再次感谢你的帮助。今天我学到了一些关于java的新知识。