Java Tapestry5在服务定位器方法中返回服务接口时编译错误

Java Tapestry5在服务定位器方法中返回服务接口时编译错误,java,spring,tapestry,Java,Spring,Tapestry,我有一个名为DMSServiceLocator.class的服务定位器类,其中有一个名为getParser()的方法,返回类型为Parser。我试图返回一个名为AutoMateParser的服务,该服务带有一个扩展解析器的Impl,但是我得到一个编译错误,说需要解析器,发现AutoMateParser。当我返回新的AutoMateServiceImpl()而不是我的服务接口时,我没有收到编译错误。我的getParser()方法似乎没有意识到autoMateParser是同一类型的。我尝试使用解析

我有一个名为DMSServiceLocator.class的服务定位器类,其中有一个名为getParser()的方法,返回类型为Parser。我试图返回一个名为AutoMateParser的服务,该服务带有一个扩展解析器的Impl,但是我得到一个编译错误,说需要解析器,发现AutoMateParser。当我返回新的AutoMateServiceImpl()而不是我的服务接口时,我没有收到编译错误。我的getParser()方法似乎没有意识到autoMateParser是同一类型的。我尝试使用解析器“return(Parser)AutoMateParser;”来转换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);
}

您正在尝试返回类型为
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的新知识。