Tapestry5编译错误,返回服务定位器方法中的服务接口



我有一个名为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();
        }
    }
}

最新更新