0

我有一个名为 DMSServiceLocator.class 的服务定位器类,其中有一个名为 getParser() 的方法,其返回类型为 Parser。我正在尝试使用扩展 Parser 的 Impl 返回一个名为 AutoMateParser 的服务,但是我收到一个编译错误,提示需要 Parser,找到 AutoMateParser。当我返回 new AutoMateServiceImpl() 而不是我的服务接口时,我没有收到任何编译错误。我的 getParser() 方法似乎没有意识到 autoMateParser 是同一类型。我尝试使用 Parser 投射 AutoMateParser,“return (Parser) 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
    }
}

解析器类

public abstract class Parser {
    //some csv line reader code
    protected abstract Vehicle parseCar(String carData);
}
4

1 回答 1

1

您正在尝试返回类型的对象AutoMateParser。该接口不是Parser(仅AutoMateParserImpl是)的子类型,因此编译器会抱怨。您需要重新考虑您的类层次结构。

您可以使用该方法提取一个Parser接口,扩展该接口,创建一个实现该接口的抽象类,并让您的服务定位器返回接口类型而不是抽象实现。parseCarAutoMateParserParserImplParserParser

编辑:类型可能看起来像这样:

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();
        }
    }

}
于 2012-08-21T07:04:17.917 回答